Python 操作word excel 的小案例

案例背景

项目要求将外业所测宗地数据叠加到现状图、规划图上,套取相对应地类面积。之后每一宗地提交一固定模版的报告,涉及宗地所占各种地类、面积、简图及现场照片。

解决思路

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)
示例文件内结构

Subscribe
提醒
guest

0 评论
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
交流思想,留下评论.x