ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板

该文章介绍了一种使用ArcGIS的arcpy模块来批量处理MXD文件,自动化填写Word模板中的要素属性表,并插入对应要素截图的方法。代码详细展示了如何设置基础数据、创建Word应用对象、遍历要素、插入图片以及保存为独立的Word文档。适用场景包括从GIS数据生成报告,且要求所有文件和目录避免使用中文名,以兼容Python2.7。

专栏文章

ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改
ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片



功能说明

在日常工作中,常常需要将arcgis的要素属性表填写到word文档中, 偶尔还要将要素的截图插入word中,一般都是有一个word模板,里面有表格填写了字段名称,需要逐个填写要素属性,并配备要素截图。样例word模板如下:
请添加图片描述
本代码目标为:

  • 1 读取图层要素的字段数据,自动填入word模板的表格中。
  • 2 将要素对应的截图 ,自动插入word模板中。
  • 3 每个要素数据单独保存一个word文档。

1 准备工作

软件环境为ArcGIS10.8,python版本为2.7,对中文支持不好,故所有的文件和目录需要为非中文状态。

  1. 本文使用的word模板为D盘根目录下的“test.docx”;
  2. 要素数据图层为D盘更目录下test.mdb/XZQ图层,读取和填写的字段为“BSM”、“XZQDM”、“XZQMC”;
  3. 要素的截图存放在D盘根目录,以要素的“BSM”字段命名的JPG,无重复值。
  4. 如何批量截图,请参照我的专栏文章《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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da-peng-song

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值