ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板
专栏文章
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,对中文支持不好,故所有的文件和目录需要为非中文状态。
- 本文使用的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代码工具——将要素属性表字段及要素截图插入word模板相关推荐
- ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片
ArcGIS arcpy代码工具--数据驱动工具批量导出MXD文档并同步导出图片 功能说明: 1 准备工作 设置数据驱动页面 页面范围设置 保存MXD文档 2 代码分段 (1)设定基础数据 (2)调用 ...
- ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改
批量对MXD文件的页面布局设置修改 功能说明: 1 修改前的分幅图状态 2 代码分段 (1)设置工作空间,获取MXD文件 . (2)循环遍历每个mxd文件 . (3)打开mxd文档 . (4)设置页面 ...
- arcgis更改字段名_ArcGIS怎么修改属性表字段名称
1.打开ArcMap,选择"Add Data",加入刚才修改了字段的属性表: 2.选择"Editor"->"start editing" ...
- ArcPy高级开发教程—属性表字段操作
今天,将介绍使用ArcPy对矢量数据的属性表的字段进行增删改查操作. 1. 属性表字段查询 import arcpyfields = arcpy.ListFields(shpPath) shpPath ...
- ArcGIS属性表字段自动编号
2018.11.8学习记录 ArcGIS属性表字段自动编号 属性表字段--字段计算器 Parser: PythonExpression: accumulate(!FieldA!)Code Block: ...
- arcgis属性表选择两个条件_arcgis中给属性表字段按条件批量赋值
1.金锄头文库是"C2C"交易模式,即卖家上传的文档直接由买家下载,本站只是中间服务平台,本站所有文档下载所得的收益全部归上传人(卖家)所有,作为网络服务商,若您的权利被侵害请及时 ...
- day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作...
在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库)增create database day43 charset utf8;改alter ...
- Python中ArcPy读取Excel表格数据创建矢量要素图层并生成属性表字段与内容
1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有一个记录北京市部分PM2.5浓度监测站点信息的Excel表格数据,格式为.xls:文件内包含站点编号.X与Y坐标.站点名称等四列数据 ...
- Arcgis属性表字段值批量替换
1.简述 实验课上,老师让我们依据出台的<国土空间调查.规划.用途管制用地用海分类说明>更改原有三调数据分类名中的属性字段值, 如上图所示,原始的三调数据中的分类名:冰川及永久积累,依据新 ...
最新文章
- java中基本字节输出流类是_java中基本输入输出流的解释
- 手把手教你使用koa2
- 关于Ajax 4-9
- unity塔防游戏怪物转向_红包版塔防游戏合集-可以赚钱领红包的塔防游戏-无广告塔防游戏红包版大全...
- java获取access token_【Java示例】如何获取AccessToken
- python插入排序
- 数电课设——基于74系列芯片搭建的交通灯控制系统电路
- 纽约比加州时间早3个小时 - 送给自己
- MCS-51单片机的硬件结构
- 指尖轻舞桌面:Slide On Desk - 主题风格制作指南
- go-pitaya学习笔记(12) - 看一看火龙果内置模块
- Date DateFormat SimpleDateFormat Calendar Joda-Time
- 2017年值得一看的7个APP设计
- 解决Ubuntu 20.04挂载NTFS分区不能写入(只读权限)的问题
- imazing是什么?为什么选择 iMazing?
- 怎么隐藏label标签
- anbu三年模拟_暗部共享三年模拟软件库
- 利息理论 标准型年金的再投资问题
- 金融专业学生收卖废品,做起了“破烂王”
- Chrome浏览器,就是我所需要的浏览器
热门文章
- 关系型数据库和非关系型数据库的详细分析
- 知识付费的思考和发展策略分析
- delay函数c语言例子,模拟delay函数
- imgareaselect + php 裁剪和上传,jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能
- python3 获取京东冰箱的相关数据(学习记录)
- 如何才能进阶高级Java程序员?
- 为什么蓝牙耳机玩吃鸡总是延迟?500左右哪款蓝牙耳机好用?
- 你们要的代码来了!爬了菊姐的两万条评论——详细代码解读篇
- js-设计并实现 Promise.race()
- python相关性分析_Python:相关性分析