案例背景
项目要求将外业所测宗地数据叠加到现状图、规划图上,套取相对应地类面积。之后每一宗地提交一固定模版的报告,涉及宗地所占各种地类、面积、简图及现场照片。
解决思路
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)
