0. 引言
前两天整理了一篇使用Word中的邮件合并功能实现使用Excel数据源填入Word指定位置,从而批量生成相似文档的功能,实际上是在为今天的这篇文章做铺垫。这次我打算实现的功能是通过Python来批量将Excel数据填入Word中,针对的场景是于客户签订合同或是制作基于模版的公司章程或股东会决议。
完成这个操作需要用到的是Python当中一个叫做docx-mailmerge的包,这个包的作用是解析MS Word docx文件,并且找到合并字段并且用你想要的任何值去填充他们。其实,这个“mailmerge”可以是一个有用的模板系统,可以用于更复杂的解决方案,而不仅仅是填充文档中的名称和地址。自动化效果https://www.zhihu.com/video/1201516470485991424
目前已经可以实现多个文档同时生成(评论区的朋友太棒啦),若有其他问题期待大家留言交流
1. 整体思路
我的大题思路是:制作好模版和脚本—将收集表发给客户收集信息—运行脚本生成文档—打印签字并存档
需要的工具:Python3及以上版本、Office(WPS理论上可以,暂时未测试)、表单工具(腾讯文档或番茄表单)
2. 模版和表单处理
这里我以网上一个通用合同模版作为示范,先根据内容插入所需要的域,尽量以英文命名。涉及的数据有甲方的名称、代表、地址、电话、日期,所以域和表单的内容都应按照这几个关键词来设置。(这里以Mac的Office为例,Win可能有所区别)
域的设置;光标停在指定位置—插入—域—邮件合并—MergeField—键入名称
表单部分:代码是按照列来填入,所以名称不会影响填入,表单项目选择对应的中文名即可,同时为了防止漏项导致填错,可以将所有项目设置为必填。
3. 程序编写
再说代码之前,先说一下需要提前导入的模块,分别为docx-mailmerge以及xlrd库,所以因先打开Win的命令提示符和Mac的终端,分别输入
pip3 install docx-mailmerge
pip3 install xlrd
注意这里是在系统终端中输入,而非IDLE中(很多初学者比如我会犯的错误),导入下载会自动运行,已安装效果如下:
使用IDLE这时就可以直接使用了,如果使用的是Pycharm,则需要在设置里导入相关的模块。
代码部分:
import xlrd # 引入Excel读取模块
from mailmerge import MailMerge # 引用邮件处理模块
datafile_path = '/Users/smilence/Desktop/合同Test(收集结果).xlsx' # 表格位置
data = xlrd.open_workbook(datafile_path) # 获取数据
table = data.sheet_by_name('合同Test') # 这里的表名要注意
nrows = table.nrows
template = '/Users/smilence/Desktop/合同模版.docx' # 模版位置
for i in range(nrows): # 循环逐行打印
if i > 0: # 排除0项无用数据
document = MailMerge(template)
document.merge(
PartyA=table.row_values(i)[2], # 第三列到域1
Affair=table.row_values(i)[3], # 第四列到域2
Name=table.row_values(i)[4], # 第五列到域3
Address=table.row_values(i)[5], # 第六列到域4
Tel=table.row_values(i)[6], # 第七列到域5
Date=table.row_values(i)[7] # 第八列到域6
)
wordname = table.row_values(i)[2] + '合同.docx' # 甲方作为文件名
document.write(wordname) # 创建新文件
代码已经更新过了,我在代码后做了注释,需要修改的地方主要在文件的路径和需要填入的内容上
4. 数据获取(可以一次多条记录)
将收集表发给需要填写的人,填写完后汇总成表格,并下载成xlsx格式(步骤可以参考上一篇文章)
5. 文档生成
若代码部分未使用绝对路径,则应当保证模版、表格、脚本处于同一路径下,直接运行或使用IDLE运行即可。