用 Python 根据已有 Word 模板文件与需求自动生成多个文档
前言:
在日常办公中操作 Word 文档时,经常会对已经有的Word文档的内容进行修改,比较少会直接新建一个空白的 Word 文档,再往里面写东西。
这篇博客也是介绍一个根据已有的 Word 文档,按照特定需求生成多个Word文档的实例。
需求描述:
假定某市行政中心需要对管辖范围内的用水电气居民用户发送缴费通知单,通知单如下图:
用水电气数据已经统计在一个 Excel 文件中,Excel 表格数据如下:
上表有25条用户数据,就是要根据这些数据创建25个Word文档,手动更改Word 文档似乎也可以。但是实际情况不可能只有25条数据,很可能是几千条数据,要手动创建更改Word文档就很麻烦了。而面对这种重复性强,逻辑简单的办公需要,用 Python 来提高效率简直完美。
具体需求:
读取 Excel 文件数据,根据数据内容与Word模板,新建对应数据条数的缴费通知单,将新建通知单以用户名命令,并保存在一个文件夹中。
主要思路及代码:
读取Word模板数据:
分析:
从需求上来看,核心功能就是要: 读取模板文件,在不改变模板文件中段落、文字格式的前提下,根据数据内容替换部分文字。
根据需要,调整的 Word 模板文件截图:
从前面几篇博客的介绍,可知Word文档中文字信息及格式都是保存在 run 对象中的。
所以先获取 Word 模板中正文段落所有的 run 对象:
import docx
# 读取 word 模板文件
template_word = docx.Document('test01.docx') # 获取docx对象
# word 模板正文段落、表格所有 run 对象列表
template_runs = []
# 获取正文所有段落对象列表
pars = template_word.paragraphs
print(pars)
print(len(pars)) # 8
# 遍历段落对象列表,获得每一个段落对象
for par in pars:
# 遍历段落对象的 run 对象列表,获得每一个run对象
for run in par.runs:
# 测试(看一下 run 内字符串是否与预期一致!!!)
print(run.text)
template_runs.append(run)
测试的那一步很重要,因为在run对象中包含格式信息,所以有的 run.text 文字可能会和预期不一致。
run.text 部分打印截图:
注:上面的打印信息里,一个 run.text 必须要包含想替换字段,否则后期替换就会失败。所以要保证:需替换字段格式必须完全一致。
接下来就是获取 Word 文档 表格内所有单元格的 run 对象 了:
# 获取 word 文档中表格对象
word_table = template_word.tables[0]
print(word_table)
# <docx.table.Table object at 0x000002173C43BB08>
# 获取文档表格中所有单元格的段落对象
for cell