ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板
專欄文章
ArcGIS arcpy代碼工具——批量對(duì)MXD文件的頁(yè)面布局設(shè)置修改
ArcGIS arcpy代碼工具——數(shù)據(jù)驅(qū)動(dòng)工具批量導(dǎo)出MXD文檔并同步導(dǎo)出圖片
文章目錄
- 專欄文章
- 功能說(shuō)明
- 1 準(zhǔn)備工作
- 2 代碼分段
- (1) 設(shè)置基礎(chǔ)數(shù)據(jù)
- (2) 設(shè)置要素的游標(biāo)
- (3) 創(chuàng)建Word應(yīng)用程序?qū)ο?/li>
- (4) 遍歷要素屬性表,填寫word模板
- (5) 插入圖片
- (6) 另存為 word文檔
- (7) 關(guān)閉word文檔,結(jié)束 進(jìn)程
- (8) 成果展示
- 3 完整代碼
- 4 后記
功能說(shuō)明
在日常工作中,常常需要將arcgis的要素屬性表填寫到word文檔中, 偶爾還要將要素的截圖插入word中,一般都是有一個(gè)word模板,里面有表格填寫了字段名稱,需要逐個(gè)填寫要素屬性,并配備要素截圖。樣例word模板如下:
本代碼目標(biāo)為:
- 1 讀取圖層要素的字段數(shù)據(jù),自動(dòng)填入word模板的表格中。
- 2 將要素對(duì)應(yīng)的截圖 ,自動(dòng)插入word模板中。
- 3 每個(gè)要素?cái)?shù)據(jù)單獨(dú)保存一個(gè)word文檔。
1 準(zhǔn)備工作
軟件環(huán)境為ArcGIS10.8,python版本為2.7,對(duì)中文支持不好,故所有的文件和目錄需要為非中文狀態(tài)。
2 代碼分段
(1) 設(shè)置基礎(chǔ)數(shù)據(jù)
//設(shè)置基礎(chǔ)數(shù)據(jù) workspace = r"d:/" fc = r"d:/test.mdb/XZQ" field_names = ["BSM", "XZQDM", "XZQMC"] # 替換為實(shí)際字段名 template_doc = r"d:/test.docx"(2) 設(shè)置要素的游標(biāo)
設(shè)置游標(biāo),即讀取要素層
//設(shè)置游標(biāo) cursor = arcpy.SearchCursor(fc)在設(shè)置游標(biāo)時(shí),也可以選取自己需的字段,屏蔽無(wú)用字段,方便查詢操作
//設(shè)置游標(biāo),選擇字段 cursor = arcpy.SearchCursor(fc, ["OID@", "BSM", "XZQDM", "XZQMC","SHAPE@"])(3) 創(chuàng)建Word應(yīng)用程序?qū)ο?/h3>
創(chuàng)建word實(shí)例,讀取word模板
// 創(chuàng)建Word應(yīng)用程序?qū)ο?word = win32.gencache.EnsureDispatch("Word.Application")//打開本地Word模板文檔 doc = word.Documents.Open(template_doc)//獲取文檔段落對(duì)象 paragraphs = doc.Paragraphs(4) 遍歷要素屬性表,填寫word模板
for循環(huán)遍歷要素,要素屬性表相當(dāng)于一個(gè)工作簿,第1個(gè)參數(shù)是索引號(hào),第2個(gè)參數(shù)是每個(gè)要素?cái)?shù)據(jù)一行,即每個(gè)要素又是一張表單(也可以理解為字典,字段名:字段值),設(shè) 2個(gè)參數(shù)。
//遍歷要素屬性表 for i, row in enumerate(cursor):讀取word模板的表格,因?yàn)槟0逯挥?個(gè)表格,故 表格索引號(hào)為 1.
// 獲取文檔表格對(duì)象table = doc.Tables(1)向表格內(nèi)填寫數(shù)據(jù),表格的單元格管理和office的excle表格類似,table.Cell(行數(shù),列數(shù))就定位了該單元格。
填寫數(shù)據(jù)使用 table.Cell(X,Y).Range.Text = 文本。
本文word模板的表格第一行為表頭,故填寫數(shù)據(jù)的行號(hào)為2;
列數(shù)按照字段順序 [“BSM”, “XZQDM”, “XZQMC”],可以用填表方法設(shè)定列數(shù)1、2、3填寫三次;也可以用for循環(huán)調(diào)用,如下代碼:
(5) 插入圖片
指定單元格,插入圖片,使用要素的“BSM”字段進(jìn)行匹配。
// 在表格中插入圖片oid = row.getValue("BSM")table.Cell(3, 1).Range.InlineShapes.AddPicture(r"D:/mulu/{}.jpg".format(oid))(6) 另存為 word文檔
代碼是直接讀取 word文檔并填寫數(shù)據(jù)的,故需要對(duì)word文檔進(jìn)行 “另存為”,使用字段進(jìn)行命名。
循環(huán)過程中, word模板已經(jīng)被填寫了數(shù)據(jù),反復(fù)使用將使填寫的數(shù)據(jù)被覆蓋,故需要對(duì)word模板進(jìn)行重置,即 給 doc 賦值為 循環(huán)外的 空白模板文件。
(7) 關(guān)閉word文檔,結(jié)束 進(jìn)程
循環(huán)結(jié)束后,關(guān)閉word模板文檔,結(jié)束進(jìn)行,清空緩存。
// 關(guān)閉Word模板文檔 doc.Close()// 退出Word應(yīng)用程序?qū)ο?word.Quit()(8) 成果展示
代碼運(yùn)行后,在指定目錄生成docx文檔,每個(gè)文檔對(duì)應(yīng)一個(gè)要素,里面填寫了字段數(shù)據(jù)和截圖。如下:
3 完整代碼
# coding=utf-8 import arcpy import win32com.client as win32# 設(shè)置要素類路徑、字段名列表、模板文檔路徑和輸出文檔路徑 workspace = r"d:/" fc = r"d:/test.mdb/XZQ" field_names = ["BSM", "XZQDM", "XZQMC"] # 替換為實(shí)際字段名 template_doc = r"d:/test.docx" # output_doc = r"d:/test2.docx"# 獲取要素屬性表游標(biāo) cursor = arcpy.SearchCursor(fc) # cursor = arcpy.SearchCursor(fc, ["OID@", "BSM", "XZQDM", "XZQMC","SHAPE@"])# 創(chuàng)建Word應(yīng)用程序?qū)ο?/span> word = win32.gencache.EnsureDispatch("Word.Application")# 打開本地Word模板文檔 doc = word.Documents.Open(template_doc)# 獲取文檔段落對(duì)象 paragraphs = doc.Paragraphs# 遍歷要素屬性表 for i, row in enumerate(cursor):# 獲取文檔表格對(duì)象table = doc.Tables(1)# 填寫指定單元格 行數(shù)row_index = 2 # 行數(shù),替換為實(shí)際 填寫的單元格 行數(shù)# 單元格 列數(shù),填寫表格 數(shù)據(jù)行文本for j, field_name in enumerate(field_names):table.Cell(row_index, j + 1).Range.Text = row.getValue(field_name)# 在表格中插入圖片oid = row.getValue("BSM") # 用 BSM 字段 匹配 圖片table.Cell(3, 1).Range.InlineShapes.AddPicture(r"D:/mulu/{}.jpg".format(oid))# 另存為 并關(guān)閉Word模板文檔doc.SaveAs(workspace + 'doc_{}.docx'.format(oid))# 重置 doc模板doc = word.Documents.Open(template_doc) # 關(guān)閉Word模板文檔 doc.Close()# 退出Word應(yīng)用程序?qū)ο?/span> word.Quit()4 后記
原本想法是將所有的要素?cái)?shù)據(jù)和插圖,填寫到一個(gè)word文檔,但是受python2.7版本限制,對(duì)docx的支持有限,在對(duì)word模板頁(yè)進(jìn)行克隆復(fù)制時(shí),能夠?qū)崿F(xiàn)文本和表格的復(fù)制,但是文本和表格的格式丟失了,文本字體錯(cuò)亂,表格邊框?yàn)榭?#xff0c;繼續(xù)嘗試較為復(fù)雜?,F(xiàn)在的結(jié)果是,每一個(gè)要素對(duì)應(yīng)一個(gè)word文檔,可以使用docx批量打印工具,或者單獨(dú)轉(zhuǎn)為PDF文件后再合并再一起。后續(xù)嘗試使用python3版本合并word文檔。syq
總結(jié)
以上是生活随笔為你收集整理的ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金蝶EAS BOS常用快捷键
- 下一篇: 关于点对问题