专栏文章
ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改
ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片
文章目录
功能说明
在日常工作中,常常需要将arcgis的要素属性表填写到word文档中, 偶尔还要将要素的截图插入word中,一般都是有一个word模板,里面有表格填写了字段名称,需要逐个填写要素属性,并配备要素截图。样例word模板如下:

本代码目标为:
- 1 读取图层要素的字段数据,自动填入word模板的表格中。
- 2 将要素对应的截图 ,自动插入word模板中。
- 3 每个要素数据单独保存一个word文档。
1 准备工作
软件环境为ArcGIS10.8,python版本为2.7,对中文支持不好,故所有的文件和目录需要为非中文状态。
- 本文使用的word模板为D盘根目录下的“test.docx”;
- 要素数据图层为D盘更目录下test.mdb/XZQ图层,读取和填写的字段为“BSM”、“XZQDM”、“XZQMC”;
- 要素的截图存放在D盘根目录,以要素的“BSM”字段命名的JPG,无重复值。
- 如何批量截图,请参照我的专栏文章《ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片》。

2 代码分段
(1) 设置基础数据
//设置基础数据
workspace = r"d:/"
fc = r"d:/test.mdb/XZQ"
field_names = ["BSM", "XZQDM", "XZQMC"] # 替换为实际字段名
template_doc = r"d:/test.docx"
(2) 设置要素的游标
设置游标,即读取要素层
//设置游标
cursor = arcpy.SearchCursor(fc)
在设置游标时,也可以选取自己需的字段,屏蔽无用字段,方便查询操作
//设置游标,选择字段
cursor = arcpy.SearchCursor(fc, ["OID@", "BSM", "XZQDM", "XZQMC","SHAPE@"])
(3) 创建Word应用程序对象
创建word实例,读取word模板
// 创建Word应用程序对象
word = win32.gencache.EnsureDispatch("Word.Application")
//打开本地Word模板文档
doc = word.Documents.Open(template_doc)
//获取文档段落对象
paragraphs = doc.Paragraphs
(4) 遍历要素属性表,填写word模板
for循环遍历要素,要素属性表相当于一个工作簿,第1个参数是索引号,第2个参数是每个要素数据一行,即每个要素又是一张表单(也可以理解为字典,字段名:字段值),设 2个参数。
//遍历要素属性表
for i, row in enumerate(cursor):
读取word模板的表格,因为模板只有1个表格,故 表格索引号为 1.
// 获取文档表格对象
table = doc.Tables(1)
向表格内填写数据,表格的单元格管理和office的excle表格类似,table.Cell(行数,列数)就定位了该单元格。
填写数据使用 table.Cell(X,Y).Range.Text = 文本。
本文word模板的表格第一行为表头,故填写数据的行号为2;
列数按照字段顺序 [“BSM”, “XZQDM”, “XZQMC”],可以用填表方法设定列数1、2、3填写三次;也可以用for循环调用,如下代码:
// 定位 单元格行数
row_index = 2 # 行数,替换为实际 填写的单元格 行数
//定位 单元格列数,用for循环
for j, field_name in enumerate(field_names):
table.Cell(row_index, j + 1).Range.Text = row.getValue(field_name)
(5) 插入图片
指定单元格,插入图片,使用要素的“BSM”字段进行匹配。
// 在表格中插入图片
oid = row.getValue("BSM")
table.Cell(3, 1).Range.InlineShapes.AddPicture(r"D:/mulu/{}.jpg".format(oid))
(6) 另存为 word文档
代码是直接读取 word文档并填写数据的,故需要对word文档进行 “另存为”,使用字段进行命名。
循环过程中, word模板已经被填写了数据,反复使用将使填写的数据被覆盖,故需要对word模板进行重置,即 给 doc 赋值为 循环外的 空白模板文件。
// 另存为 并关闭Word模板文档
doc.SaveAs(workspace + 'doc_{}.docx'.format(oid))
// 重置 doc模板
doc = word.Documents.Open(template_doc)
(7) 关闭word文档,结束 进程
循环结束后,关闭word模板文档,结束进行,清空缓存。
// 关闭Word模板文档
doc.Close()
// 退出Word应用程序对象
word.Quit()
(8) 成果展示
代码运行后,在指定目录生成docx文档,每个文档对应一个要素,里面填写了字段数据和截图。如下:


3 完整代码
# coding=utf-8
import arcpy
import win32com.client as win32
# 设置要素类路径、字段名列表、模板文档路径和输出文档路径
workspace = r"d:/"
fc = r"d:/test.mdb/XZQ"
field_names = ["BSM", "XZQDM", "XZQMC"] # 替换为实际字段名
template_doc = r"d:/test.docx"
# output_doc = r"d:/test2.docx"
# 获取要素属性表游标
cursor = arcpy.SearchCursor(fc)
# cursor = arcpy.SearchCursor(fc, ["OID@", "BSM", "XZQDM", "XZQMC","SHAPE@"])
# 创建Word应用程序对象
word = win32.gencache.EnsureDispatch("Word.Application")
# 打开本地Word模板文档
doc = word.Documents.Open(template_doc)
# 获取文档段落对象
paragraphs = doc.Paragraphs
# 遍历要素属性表
for i, row in enumerate(cursor):
# 获取文档表格对象
table = doc.Tables(1)
# 填写指定单元格 行数
row_index = 2 # 行数,替换为实际 填写的单元格 行数
# 单元格 列数,填写表格 数据行文本
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))
# 另存为 并关闭Word模板文档
doc.SaveAs(workspace + 'doc_{}.docx'.format(oid))
# 重置 doc模板
doc = word.Documents.Open(template_doc)
# 关闭Word模板文档
doc.Close()
# 退出Word应用程序对象
word.Quit()
4 后记
原本想法是将所有的要素数据和插图,填写到一个word文档,但是受python2.7版本限制,对docx的支持有限,在对word模板页进行克隆复制时,能够实现文本和表格的复制,但是文本和表格的格式丢失了,文本字体错乱,表格边框为空,继续尝试较为复杂。现在的结果是,每一个要素对应一个word文档,可以使用docx批量打印工具,或者单独转为PDF文件后再合并再一起。后续尝试使用python3版本合并word文档。syq
该文章介绍了一种使用ArcGIS的arcpy模块来批量处理MXD文件,自动化填写Word模板中的要素属性表,并插入对应要素截图的方法。代码详细展示了如何设置基础数据、创建Word应用对象、遍历要素、插入图片以及保存为独立的Word文档。适用场景包括从GIS数据生成报告,且要求所有文件和目录避免使用中文名,以兼容Python2.7。
5672

被折叠的 条评论
为什么被折叠?



