案例背景
项目要求将外业所测宗地数据叠加到现状图、规划图上,套取相对应地类面积。之后每一宗地提交一固定模版的报告,涉及宗地所占各种地类、面积、简图及现场照片。
解决思路
1.arcgis 叠加分析地类面积,导出excel表格,批量生成各宗地简图;
2.python中利用xlrd 按行读取数据,以唯一编号批量操作数据、图片;
3.利用docxtpl模块按照事先设计好的模版在相应位置填充内容;
4.利用python-docx创建、保存docx文档。
涉及python包
python-docx 读写word文档
xlrd 读写excel表格
docxtpl 操作word模板
代码
#!/usr/bin/env python
# -*-coding:utf-8-*-
import os
import docx
import docxtpl
import xlrd
from docx.shared import Inches
# 读取表格数据
data = xlrd.open_workbook(os.path.abspath("现状规划.xls"))
sheet = data.sheets()
table0 = sheet[0]
# 创建工作文件夹
def creat_result_dir():
a = input('命名成果文件夹:')
try:
os.mkdir(a)
except(FileExistsError):
print('文件夹已经存在')
except:
print('未知异常')
return a
a = creat_result_dir()
# 利用word模版,将读取表格数据、图片写入对应位置
for row in range(1, table0.nrows):
try:
t = table0.row_values(row)
tpl = docxtpl.DocxTemplate(os.path.abspath('模板.docx'))
# 读取图片路径,现状、规划图片均以图斑号命名,图片仅有1个;现场照片内文件夹以图斑号命名,图片有多个
image1_path = os.path.join(os.path.abspath('规划'), '%s.jpg' % str(t[1]))
image2_path = os.path.join(os.path.abspath('现状'), '%s.jpg' % str(t[1]))
path_images3 = os.path.join(os.path.abspath('现场'), '%s' % str(t[1]))
images = os.listdir(os.path.abspath(path_images3))
if len(images) > 1:
print('2')
images3 = os.path.join(path_images3, images[0])
images4 = os.path.join(path_images3, images[1])
insert_image3 = docxtpl.InlineImage(tpl, images3, width=Inches(5))
insert_image4 = docxtpl.InlineImage(tpl, images4, width=Inches(5))
insert_image1 = docxtpl.InlineImage(tpl, image1_path, width=Inches(5))
insert_image2 = docxtpl.InlineImage(tpl, image2_path, width=Inches(5))
# insert_image5 = docxtpl.InlineImage(tpl, images5, width=Inches(5))
context = {
'template0': t[0],
'template1': t[1],
'template2': t[2],
'image1': insert_image1,
'image2': insert_image2,
'image3': insert_image3,
'image4': insert_image4,
}
tpl.render(context)
result = os.path.join(os.path.abspath(a), '%s.docx' % t[1])
tpl.save(result)
doc2 = docx.Document(result)
print('完成 %s' % str(t[1]))
doc2.save(result)
#该部分代码偷懒未复用,建议复用减少代码量
else:
images3 = os.path.join(path_images3, images[0])
insert_image3 = docxtpl.InlineImage(tpl, images3, width=Inches(5))
insert_image1 = docxtpl.InlineImage(tpl, image1_path, width=Inches(5))
insert_image2 = docxtpl.InlineImage(tpl, image2_path, width=Inches(5))
# insert_image5 = docxtpl.InlineImage(tpl, images5, width=Inches(5))
context = {
'template0': t[0],
'template1': t[1],
'template2': t[2],
'image1': insert_image1,
'image2': insert_image2,
'image3': insert_image3,
}
tpl.render(context)
result = os.path.join(os.path.abspath(a), '%s.docx' % t[1])
tpl.save(result)
doc2 = docx.Document(result)
print('完成 %s' % str(t[1]))
doc2.save(result)
#处理异常
except:
print(EOFError)

