专栏文章

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


文章目录

  • 专栏文章
  • 功能说明
  • 1 准备工作
  • 2 代码分段
    • (1) 设置基础数据
    • (2) 设置要素的游标
    • (3) 创建Word应用程序对象
    • (4) 遍历要素属性表,填写word模板
    • (5) 插入图片
    • (6) 另存为 word文档
    • (7) 关闭word文档,结束 进程
    • (8) 成果展示
  • 3 完整代码
  • 4 后记

功能说明

在日常工作中,常常需要将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

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

  1. ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片

    ArcGIS arcpy代码工具--数据驱动工具批量导出MXD文档并同步导出图片 功能说明: 1 准备工作 设置数据驱动页面 页面范围设置 保存MXD文档 2 代码分段 (1)设定基础数据 (2)调用 ...

  2. ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改

    批量对MXD文件的页面布局设置修改 功能说明: 1 修改前的分幅图状态 2 代码分段 (1)设置工作空间,获取MXD文件 . (2)循环遍历每个mxd文件 . (3)打开mxd文档 . (4)设置页面 ...

  3. arcgis更改字段名_ArcGIS怎么修改属性表字段名称

    1.打开ArcMap,选择"Add Data",加入刚才修改了字段的属性表: 2.选择"Editor"->"start editing" ...

  4. ArcPy高级开发教程—属性表字段操作

    今天,将介绍使用ArcPy对矢量数据的属性表的字段进行增删改查操作. 1. 属性表字段查询 import arcpyfields = arcpy.ListFields(shpPath) shpPath ...

  5. ArcGIS属性表字段自动编号

    2018.11.8学习记录 ArcGIS属性表字段自动编号 属性表字段--字段计算器 Parser: PythonExpression: accumulate(!FieldA!)Code Block: ...

  6. arcgis属性表选择两个条件_arcgis中给属性表字段按条件批量赋值

    1.金锄头文库是"C2C"交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时 ...

  7. day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作...

    在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库)增create database day43 charset utf8;改alter ...

  8. Python中ArcPy读取Excel表格数据创建矢量要素图层并生成属性表字段与内容

    1 任务需求   首先,我们来明确一下本文所需实现的需求.   现有一个记录北京市部分PM2.5浓度监测站点信息的Excel表格数据,格式为.xls:文件内包含站点编号.X与Y坐标.站点名称等四列数据 ...

  9. Arcgis属性表字段值批量替换

    1.简述 实验课上,老师让我们依据出台的<国土空间调查.规划.用途管制用地用海分类说明>更改原有三调数据分类名中的属性字段值, 如上图所示,原始的三调数据中的分类名:冰川及永久积累,依据新 ...

最新文章

  1. java中基本字节输出流类是_java中基本输入输出流的解释
  2. 手把手教你使用koa2
  3. 关于Ajax 4-9
  4. unity塔防游戏怪物转向_红包版塔防游戏合集-可以赚钱领红包的塔防游戏-无广告塔防游戏红包版大全...
  5. java获取access token_【Java示例】如何获取AccessToken
  6. python插入排序
  7. 数电课设——基于74系列芯片搭建的交通灯控制系统电路
  8. 纽约比加州时间早3个小时 - 送给自己
  9. MCS-51单片机的硬件结构
  10. 指尖轻舞桌面:Slide On Desk - 主题风格制作指南
  11. go-pitaya学习笔记(12) - 看一看火龙果内置模块
  12. Date DateFormat SimpleDateFormat Calendar Joda-Time
  13. 2017年值得一看的7个APP设计
  14. 解决Ubuntu 20.04挂载NTFS分区不能写入(只读权限)的问题
  15. imazing是什么?为什么选择 iMazing?
  16. 怎么隐藏label标签
  17. anbu三年模拟_暗部共享三年模拟软件库
  18. 利息理论 标准型年金的再投资问题
  19. 金融专业学生收卖废品,做起了“破烂王”
  20. Chrome浏览器,就是我所需要的浏览器

热门文章

  1. 关系型数据库和非关系型数据库的详细分析
  2. 知识付费的思考和发展策略分析
  3. delay函数c语言例子,模拟delay函数
  4. imgareaselect + php 裁剪和上传,jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能
  5. python3 获取京东冰箱的相关数据(学习记录)
  6. 如何才能进阶高级Java程序员?
  7. 为什么蓝牙耳机玩吃鸡总是延迟?500左右哪款蓝牙耳机好用?
  8. 你们要的代码来了!爬了菊姐的两万条评论——详细代码解读篇
  9. js-设计并实现 Promise.race()
  10. python相关性分析_Python:相关性分析