字鄉(xiāng)村方案:Word長文檔工程與自動化交付)
簡介這份405頁的Word版數(shù)字農(nóng)業(yè)農(nóng)村數(shù)字鄉(xiāng)村信息化項目建設(shè)方案面向智慧農(nóng)業(yè)項目經(jīng)理、咨詢規(guī)劃人員、政府信息化部門及涉農(nóng)企業(yè)方案編制者解決數(shù)字鄉(xiāng)村項目從立項、可研到招投標(biāo)階段缺少完整參考框架的問題。全包僅含1個docx文檔大小16.79MB無源碼、腳本或視頻屬于可直接編輯套用的純文檔資料便于按本地政策與預(yù)算快速裁剪已有46人學(xué)習(xí)下載。文檔目錄覆蓋總體概述、建設(shè)背景與發(fā)展機(jī)遇、政策依據(jù)與技術(shù)標(biāo)準(zhǔn)規(guī)范、設(shè)計原則與目標(biāo)并重點展開農(nóng)業(yè)農(nóng)村管理決策、農(nóng)產(chǎn)品全產(chǎn)業(yè)鏈監(jiān)測預(yù)警、數(shù)字農(nóng)業(yè)農(nóng)村服務(wù)、農(nóng)村人居環(huán)境智能監(jiān)測、鄉(xiāng)村數(shù)字治理等系統(tǒng)建設(shè)內(nèi)容同時包含現(xiàn)狀及需求分析。讀者可據(jù)此快速搭建方案骨架、對齊政策口徑、細(xì)化系統(tǒng)功能清單也可用于項目匯報與評審材料草擬具有較高的模板復(fù)用與參考價值。1. 405頁的數(shù)字鄉(xiāng)村方案卡住人的往往不是內(nèi)容評審前一晚打開那份 405 頁的數(shù)字鄉(xiāng)村信息化建設(shè)方案最常見的事故不是架構(gòu)圖畫錯而是目錄頁碼全空、圖 3-7 之后直接跳到圖 3-9、正文里掛著好幾處「錯誤未找到引用源」。這些問題跟感知設(shè)備、數(shù)據(jù)中臺一點關(guān)系都沒有全部來自文檔工程沒做樣式?jīng)]統(tǒng)一、編號靠手打、題注和交叉引用沒有用域。數(shù)字農(nóng)業(yè)農(nóng)村數(shù)字鄉(xiāng)村信息化項目建設(shè)方案是一類典型的超長交付文檔頁數(shù)在 300 到 500 之間章節(jié)覆蓋項目背景、現(xiàn)狀與需求、總體架構(gòu)、感知層、網(wǎng)絡(luò)層、數(shù)據(jù)中臺、應(yīng)用系統(tǒng)、安全運(yùn)維、投資估算和實施計劃。寫它的人通常是售前或方案工程師手上還同時壓著三四個項目要投。下面按「骨架 → 內(nèi)容生產(chǎn)線 → 技術(shù)章節(jié)怎么寫 → 交付自檢」的順序把這份超長 Word 方案拆成一套能復(fù)用的流程。不談?wù)呖趶街徽勎臋n工程和技術(shù)描述怎么經(jīng)得起評審追問。2. 數(shù)字鄉(xiāng)村方案文檔骨架樣式、多級編號與題注交叉引用2.1 為什么 405 頁的 Word 必須靠樣式而不是手動排版手動排版的典型動作是敲一個「1.1」再敲標(biāo)題文字給標(biāo)題手動加粗加大在圖片下面手寫「圖 3-2 總體架構(gòu)」。這三種動作在 30 頁的文檔里看不出問題到 400 頁就會集中爆發(fā)插入一節(jié)之后后面全錯號導(dǎo)航窗格里一片空白交叉引用找不到錨點改一個圖題要全文搜一遍。樣式的價值在于它是 Word 里唯一能承載「結(jié)構(gòu)語義」的載體。目錄、導(dǎo)航窗格、題注編號、交叉引用、STYLEREF 域全部都靠讀取段落樣式名來工作。一份方案至少要先定下這套樣式清單并且在模板文件里改默認(rèn)值而不是在正文里逐個調(diào)格式。樣式名對應(yīng)層級中文字體/字號段落設(shè)置標(biāo)題 1章黑體 小二段前 24pt、段后 18pt與下段同頁標(biāo)題 2節(jié)黑體 小三段前 18pt、段后 12pt標(biāo)題 3小節(jié)黑體 四號段前 12pt、段后 6pt正文段落宋體 小四行距 1.5 倍首行縮進(jìn) 2 字符圖題注圖片說明宋體 五號居中段前 6pt表題注表格說明宋體 五號居中段后 6pt表格文字表內(nèi)文字宋體 五號單倍行距不首行縮進(jìn)表格文字單獨(dú)建一個樣式是因為表內(nèi)加了首行縮進(jìn)會顯得參差不齊而正文樣式的縮進(jìn)不能為了表格取消。2.2 多級列表綁定標(biāo)題樣式的最小操作步驟編號不要手打交給多級列表。操作路徑是「開始 → 多級列表 → 定義新的多級列表」然后點左下角「更多」展開完整面板選級別 1在「將級別鏈接到樣式」里選「標(biāo)題 1」編號格式填第 %1 章或直接%1。選級別 2「將級別鏈接到樣式」選「標(biāo)題 2」編號格式填%1.%2。選級別 3「將級別鏈接到樣式」選「標(biāo)題 3」編號格式填%1.%2.%3。每一級都確認(rèn)「在其后重新開始編號」的層級設(shè)置正確級別 2 要從級別 1 重新開始。點確定后全文所有套了標(biāo)題樣式的段落會自動獲得編號。關(guān)鍵約束是標(biāo)題文本里不能再出現(xiàn)手打編號。一旦某幾章是手打的、某幾章是列表生成的題注的章節(jié)號就會一半對一半錯這種錯誤在評審現(xiàn)場很難當(dāng)場修。2.3 題注編號帶章節(jié)號的域代碼寫法在圖片上右鍵「插入題注」點「編號」按鈕勾選「包含章節(jié)號」章節(jié)起始樣式選「標(biāo)題 1」分隔符選「-」。做完之后圖片下方會出現(xiàn)「圖 3-2」這種形式。它的本質(zhì)是兩層域套在一起圖 { STYLEREF 1 \s }-{ SEQ 圖 \* ARABIC \s 1 }STYLEREF 1 \s取當(dāng)前位置之前最近的「標(biāo)題 1」的編號也就是章號SEQ 圖 \* ARABIC \s 1是圖序計數(shù)器\s 1表示遇到標(biāo)題 1 時重新從 1 計數(shù)。表題注同理把標(biāo)識符換成「表」即可。交叉引用時引用類型選「圖」引用內(nèi)容選「僅標(biāo)簽和編號」。不要選「整個題注」否則以后修改圖題文字所有引用處的文字會被一起改掉。注意題注編號依賴標(biāo)題的多級編號如果標(biāo)題編號本身是手打的題注會全部顯示為「圖 0-1」。2.4 用 python-docx 體檢一份已有方案文檔接手一份別人寫的方案時先跑一遍體檢看清它有多少結(jié)構(gòu)是樣式撐起來的、有多少是手打的。以下腳本只讀不寫跑完再決定是修還是重排。# docx_audit.py —— 體檢已有方案文檔的樣式使用情況 import re from collections import Counter from docx import Document DOC 數(shù)字鄉(xiāng)村信息化建設(shè)方案.docx NUM_RE re.compile(r^\d(\.\d)*[\s、.]) # 匹配 1、1.1、1.1.1 開頭 doc Document(DOC) styles, suspect Counter(), [] for p in doc.paragraphs: text p.text.strip() if not text: continue styles[p.style.name] 1 # 正文樣式卻以編號開頭基本可以判定是手打編號 if p.style.name in (Normal, 正文) and NUM_RE.match(text): suspect.append((手打編號, text[:40])) # 圖/表說明寫成了正文沒有被題注域管理 if p.style.name in (Normal, 正文) and re.match(r^[圖表][\s\d], text): suspect.append((手寫題注, text[:40])) print( 樣式使用分布前 15) for name, cnt in styles.most_common(15): print(f{cnt:7} {name}) print(f\n 疑似問題 {len(suspect)} 處 ) for kind, s in suspect[:20]: print(f [{kind}] {s})Document(DOC)只接受 .docx老 .doc 要先另存為 .docx。NUM_RE里的[\s、.]覆蓋了常見分隔符避免把「2024 年數(shù)據(jù)」誤判成編號。styles.most_common(15)只列前 15 個防止自定義樣式太多時刷屏。這個腳本判斷的是「段落樣式」不解析域代碼所以它只能告訴你結(jié)構(gòu)有沒有用好真正的編號連續(xù)性要靠第 5 章的域掃描確認(rèn)。3. 用 Pandoc 與 Python 搭建方案內(nèi)容生產(chǎn)線3.1 Markdown 單一信源加分章寫作目錄結(jié)構(gòu)400 頁放在一個 Word 文件里寫超過 100 頁之后撤銷、拼寫檢查、自動保存都會明顯變慢協(xié)作時兩個人同時動一個文件更是災(zāi)難??尚械淖龇ㄊ前?Markdown 當(dāng)源文件按章拆開Word 當(dāng)構(gòu)建產(chǎn)物。plan/ ├── templates/ │ └── ref.docx # 樣式模板標(biāo)題樣式已綁定多級列表 ├── chapters/ │ ├── 01-項目背景.md │ ├── 02-現(xiàn)狀與需求.md │ ├── 03-總體架構(gòu).md │ ├── 04-感知層設(shè)計.md │ ├── 05-數(shù)據(jù)中臺.md │ └── 06-實施計劃.md ├── data/ │ └── points.csv # 圖表用的數(shù)據(jù)源 ├── figs/ # 腳本生成的圖片 └── build/ # 輸出目錄不進(jìn)版本庫每章控制在 3000 到 8000 字改哪章開哪章。圖片一律放figs/并在 Markdown 里用相對路徑引用保證換臺機(jī)器也能構(gòu)建。3.2 pandoc 轉(zhuǎn) docx 的完整命令與參數(shù)含義pandoc \ chapters/01-項目背景.md \ chapters/02-現(xiàn)狀與需求.md \ chapters/03-總體架構(gòu).md \ chapters/04-感知層設(shè)計.md \ chapters/05-數(shù)據(jù)中臺.md \ chapters/06-實施計劃.md \ --frommarkdownpipe_tablesfootnotes \ --todocx \ --reference-doctemplates/ref.docx \ --toc --toc-depth3 \ --resource-path.:figs \ -o build/方案正文.docx各參數(shù)的作用和取值理由參數(shù)作用建議值--from聲明輸入格式與擴(kuò)展markdownpipe_tablesfootnotes--reference-doc用指定 docx 的樣式渲染輸出事先備好的ref.docx--toc插入目錄域配合--toc-depth用--toc-depth目錄收錄到第幾級標(biāo)題3對應(yīng)到小節(jié)--resource-path圖片查找路徑.:figs--number-sections自動生成標(biāo)題編號見下方說明--number-sections生成的編號是純文本編號段落樣式上不帶列表編號導(dǎo)致題注里的STYLEREF 1 \s取不到章號。正確做法是不加這個參數(shù)改為在ref.docx里把「標(biāo)題 1/2/3」這三個樣式預(yù)先綁定多級列表pandoc 只負(fù)責(zé)把 Markdown 的#、##、###映射到對應(yīng)樣式編號由 Word 自動生成題注才能正常取到章號。3.3 用 matplotlib 批量生成架構(gòu)圖與統(tǒng)計圖方案里的統(tǒng)計圖不要手工在 Excel 里拉數(shù)據(jù)一變就要重做。用腳本出圖改 CSV 重跑一次就行。# make_figs.py —— 批量出圖統(tǒng)一字體、尺寸和分辨率 import csv import matplotlib matplotlib.use(Agg) # 無圖形界面環(huán)境必需 import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [Source Han Sans SC, SimHei] plt.rcParams[axes.unicode_minus] False # 負(fù)號正常顯示 plt.rcParams[figure.dpi] 300 # 出圖分辨率打印用 plt.rcParams[savefig.bbox] tight # 去掉多余白邊 rows list(csv.DictReader(open(data/points.csv, encodingutf-8))) names [r[village] for r in rows] counts [int(r[points]) for r in rows] fig, ax plt.subplots(figsize(7.5, 4.2)) # 7.5 英寸約等于 A4 正文寬度 ax.barh(names, counts, color#2f6f4e) ax.set_xlabel(點位數(shù)量個) ax.set_title(各行政村感知設(shè)備點位分布) for i, v in enumerate(counts): ax.text(v 0.5, i, str(v), vacenter, fontsize9) fig.savefig(figs/fig-3-2-points.png) print(已生成 figs/fig-3-2-points.png)matplotlib.use(Agg)必須在導(dǎo)入 pyplot 之前調(diào)用否則在服務(wù)器上會因為沒有顯示設(shè)備報錯。figsize按 A4 正文寬度 7.5 英寸取值插進(jìn) Word 后基本不需要再縮放。figure.dpi300是打印級分辨率屏幕閱讀可以降到 150 節(jié)省體積。中文字體名要寫系統(tǒng)里真實存在的Linux 上通常是思源黑體Windows 上可以用 SimHei 兜底。提示矢量圖在 Word 里縮放不失真但 matplotlib 直接導(dǎo)出 EMF 需要額外后端一般 300dpi 的 PNG 用于 A4 打印已經(jīng)足夠。3.4 數(shù)據(jù)表從 CSV 到 Word 三線表方案里的點位統(tǒng)計、投資估算、設(shè)備清單天然適合放在 CSV 里維護(hù)。pandoc 認(rèn)管道表格寫個小腳本把 CSV 轉(zhuǎn)成 Markdown 表格片段直接貼進(jìn)對應(yīng)章節(jié)。# csv2md.py —— 把 CSV 轉(zhuǎn)成 pandoc 可識別的管道表格 import csv, sys src, dst sys.argv[1], sys.argv[2] with open(src, encodingutf-8-sig, newline) as f: rows list(csv.reader(f)) head, body rows[0], rows[1:] lines [| | .join(head) |, | |.join([ --- ] * len(head)) |] # 分隔行必須有 lines [| | .join(r) | for r in body] open(dst, w, encodingutf-8).write(\n.join(lines) \n) print(f{len(body)} 行已寫入 {dst})utf-8-sig用來吃掉 Excel 另存 CSV 時寫入的 BOM否則第一列表頭會帶一個不可見字符。分隔行里的---不能省省了 pandoc 會把整段當(dāng)成普通段落。生成后在ref.docx里把表格樣式設(shè)成三線表表頭行勾選「在各頁頂端以標(biāo)題行形式重復(fù)出現(xiàn)」跨頁的清單表才不會丟表頭。4. 方案里的技術(shù)章節(jié)怎么寫才經(jīng)得起評審4.1 感知層設(shè)備的參數(shù)表該怎么列感知層最容易被問倒的一句話是「這個點位為什么這么設(shè)計」。把設(shè)備參數(shù)寫成一張能自洽的表比寫三段文字管用。設(shè)備類型通信方式上報周期供電方式采集項點位數(shù)量土壤墑情站NB-IoT30 min太陽能鋰電土壤溫度、含水率、EC、pH42氣象站4G10 min太陽能鋰電氣溫、濕度、風(fēng)速、雨量、光照8蟲情測報燈4G1 次/日市電蟲情圖像、種類計數(shù)6水質(zhì)監(jiān)測浮標(biāo)4G60 min太陽能溶解氧、濁度、pH、氨氮12溫室環(huán)境節(jié)點LoRa5 min市電鋰電空氣溫濕度、CO?、光照180這張表的價值在于它能直接推出后面的估算上報周期乘點位數(shù)量就是日均數(shù)據(jù)條數(shù)供電方式?jīng)Q定了運(yùn)維巡檢頻次和更換電池的成本。比如土壤墑情站每天 48 次上報42 個點位一天約 2000 條記錄一年不到 75 萬條存儲壓力很小而溫室節(jié)點 5 分鐘一次、180 個點位一年接近 1900 萬條分區(qū)和冷熱分離就得寫進(jìn)方案。4.2 數(shù)據(jù)中臺落成可建表的模型寫到數(shù)據(jù)中臺時只寫「建設(shè)統(tǒng)一數(shù)據(jù)資源池」是不夠的。評審會追問數(shù)據(jù)怎么存、設(shè)備換了指標(biāo)怎么擴(kuò)展。給兩張表就能把問題擋住。-- 設(shè)備維表一臺設(shè)備一行 CREATE TABLE dim_device ( device_id VARCHAR(32) NOT NULL COMMENT 設(shè)備唯一編號, device_type VARCHAR(32) NOT NULL COMMENT 設(shè)備類型編碼, village_code VARCHAR(12) NOT NULL COMMENT 行政村區(qū)劃代碼, lon DECIMAL(10,6) COMMENT 經(jīng)度WGS84, lat DECIMAL(10,6) COMMENT 緯度WGS84, install_date DATE COMMENT 安裝日期, status TINYINT DEFAULT 1 COMMENT 1在線 0離線 -1拆除, PRIMARY KEY (device_id), KEY idx_village (village_code) ) COMMENT感知設(shè)備維表; -- 時序事實表按天分區(qū)指標(biāo)用 JSON 承載 CREATE TABLE fact_device_metric ( device_id VARCHAR(32) NOT NULL, ts DATETIME NOT NULL COMMENT 采集時間UTC8, metrics JSON NOT NULL COMMENT 指標(biāo)鍵值對, battery TINYINT COMMENT 電量百分比, PRIMARY KEY (device_id, ts) ) COMMENT設(shè)備采集事實表;維表和事實表分開是為了讓設(shè)備臺賬的變化不影響歷史數(shù)據(jù)。metrics用 JSON 而不是把每個指標(biāo)建成一列是因為設(shè)備類型有十幾種、指標(biāo)加起來幾十個寬表會有一大片空列新增一類傳感器還要改表結(jié)構(gòu)。PRIMARY KEY (device_id, ts)保證同一設(shè)備同一時刻只落一條重復(fù)上報可以直接冪等覆蓋。設(shè)備側(cè)的上報報文要和這個模型對齊{ deviceId: SOIL-0001, ts: 1735689600000, battery: 87, metrics: { soilTemp: 18.4, soilMoisture: 26.7, ec: 1.32, ph: 6.8 } }ts用毫秒時間戳避免字符串時間在不同時區(qū)解析出歧義deviceId與dim_device.device_id一一對應(yīng)平臺收到報文先查維表再落事實表查不到的設(shè)備直接進(jìn)異常隊列不要靜默丟棄。4.3 一張圖的坐標(biāo)系與圖層約定方案里但凡出現(xiàn)「一張圖」就要把坐標(biāo)系和圖層清單寫清楚否則實施階段底圖和點位對不上是常見事故。圖層名幾何類型坐標(biāo)系數(shù)據(jù)來源更新頻率行政區(qū)劃面CGCS2000區(qū)劃成果年耕地地塊面CGCS2000國土調(diào)查成果年感知設(shè)備點CGCS2000項目自建實時遙感影像柵格CGCS2000衛(wèi)星影像季專題分析面/柵格CGCS2000平臺計算月所有圖層統(tǒng)一到同一個坐標(biāo)系經(jīng)緯度字段在維表里也要注明坐標(biāo)系名稱。服務(wù)按 OGC 的 WMS/WMTS 標(biāo)準(zhǔn)發(fā)布村級底圖比例尺按 1:2000、鄉(xiāng)級按 1:10000 約定避免不同圖層疊加時清晰度差一個量級。4.4 把「建成后效果」改寫成可驗證指標(biāo)評審最喜歡追問的是「在線率 95% 怎么算出來的」。把效果描述改寫成帶定義式、數(shù)據(jù)來源和統(tǒng)計周期的指標(biāo)表這類問題就變成了對公式的確認(rèn)而不是對承諾的質(zhì)疑。指標(biāo)定義式數(shù)據(jù)來源統(tǒng)計周期目標(biāo)值設(shè)備在線率在線時長 / 應(yīng)在線時長平臺心跳表自然月≥95%數(shù)據(jù)完整率實收條數(shù) / 應(yīng)收條數(shù)事實表自然月≥98%數(shù)據(jù)及時率延遲≤2 倍上報周期的條數(shù)占比事實表自然月≥97%異常處置及時率24 小時內(nèi)閉環(huán)工單數(shù) / 總工單數(shù)運(yùn)維工單表自然月≥90%四個指標(biāo)里最容易扯皮的是「應(yīng)在線時長」方案里要寫明扣除計劃停電、設(shè)備拆除期和不可抗力時段否則驗收時分母認(rèn)定不一致指標(biāo)永遠(yuǎn)算不達(dá)標(biāo)。5. 交付前的方案文檔體檢域刷新、引用掃描與版本管理5.1 域刷新與目錄重建的順序交付前按固定順序走一遍全選CtrlA按 F9 更新域彈出對話框選「更新整個目錄」然后檢查導(dǎo)航窗格的章節(jié)層級是否和正文一致最后再另存 PDF。順序反過來會出問題——先更新目錄再更新域目錄里的頁碼是舊的。圖表編號異常時先確認(rèn)標(biāo)題樣式是否仍綁定多級列表再檢查題注是否勾選了「包含章節(jié)號」。這兩步正常F9 之后編號會自動歸位。5.2 掃描未解析交叉引用與圖片缺失來得急的時候跑一段腳本比人眼翻 400 頁可靠。docx 本質(zhì)是個 zip 包解開讀word/document.xml就能數(shù)出未解析引用、域數(shù)量和圖片數(shù)量。# check_docx.py —— 交付前體檢未解析引用、域數(shù)量、內(nèi)嵌圖片 import sys, zipfile path sys.argv[1] with zipfile.ZipFile(path) as z: names z.namelist() xml z.read(word/document.xml).decode(utf-8) media [n for n in names if n.startswith(word/media/)] unresolved xml.count(錯誤未找到引用源) # 未解析交叉引用的固定文案 fields xml.count(w:fldCharTypebegin) # 域起始標(biāo)志 print(f未解析引用 : {unresolved}) print(f域總數(shù) : {fields}) print(f內(nèi)嵌圖片 : {len(media)}) if unresolved: sys.exit(1) # 退出碼非 0可直接用于構(gòu)建流程阻斷sys.argv[1]傳 docx 路徑方便在批處理里循環(huán)多個文件。未解析引用大于 0 說明有交叉引用指向了被刪掉的圖表必須回源修。域總數(shù)是個參考值正常一份 400 頁方案的域數(shù)量在幾百到上千之間如果只有個位數(shù)多半是題注和交叉引用都沒用起來需要回頭補(bǔ)。內(nèi)嵌圖片用來和figs/目錄比對數(shù)量對不上說明有圖沒插進(jìn)去或者插成了鏈接圖。命令行下一行也能查unzip -p build/方案正文.docx word/document.xml | grep -o 錯誤未找到引用源 | wc -l5.3 版本管理Git 管源文件Word 只做產(chǎn)物Markdown、CSV、出圖腳本、ref.docx模板全部進(jìn)版本庫build/目錄和*.docx產(chǎn)物寫進(jìn).gitignore。送審時打個標(biāo)簽順手導(dǎo)出一份源碼快照git tag -a v1.0-送審 -m 送審稿對應(yīng) build/方案正文.docx git archive --formatzip -o 交付快照.zip HEADWord 的修訂模式不要和 Git 混用。評審意見以 Word 批注形式回來時把意見回填到 Markdown 源文件再重新構(gòu)建不要直接在產(chǎn)物 docx 上改完后反向覆蓋源文件否則下一次構(gòu)建會把人工修改全部沖掉。把ref.docx和check_docx.py放進(jìn)同一個倉庫下一個項目只需要換章節(jié)內(nèi)容和數(shù)據(jù)源編號、題注、目錄這三件事不用從頭再來一遍。本文還有配套的精品資源點擊獲取