在一些的项目开发中,会有一些生成Word文件的操作,比如将获取到的一些数据添加到Word模板当中的相应的位置生成一份Word文档。
由于最近的Python项目当中需要将一些从服务器查出的数据添加到Word模板当中生成一份Word文档,完成这个操作需要用到的是Python当中一个叫做docx-mailmerge的包,这个包的作用是解析MS Word docx文件,并且找到合并字段并且用你想要的任何值去填充他们。其实,这个“mailmerge”可以是一个有用的模板系统,可以用于更复杂的解决方案,而不仅仅是填充文档中的名称和地址。
首先,我们需要安装docx-mailmerge这个包。在命令行输入语句,开始安装该包。
pip install docx-mailmerge
如果你的系统中已经安装了该包,系统会有如下的提示。
在完成了docx-mailmerge的安装之后,需要在Word中进行域的设置,这些域就是你的数据填充的位置。
以Word 2013为例,在Word模板当中,将鼠标光标移动到你细腰插入数据的地方,之后按下图所示进行操作:
点击域之后,选择 邮件合并,域名选择MergeField,域名可以理解为你在代码中的一个变量,将你要插入的数据赋值给这个变量,你的数据便会插入到模板当中。另外,格式按照自己的要求去选择,默认为无。
这里我简单的编辑了一个证明的模板,在需要插入数据的地方设置完域之后,结果如下图所示:
在完成前两步工作之后,最后一步就剩下代码的编写工作了。
在本文中,其实这一部分代码非常简单,本文我写一个简单的Demo,其中我的文件名称和给域赋的值都是写死的,在项目中生成的Word名称和给域赋值都可以是变量,还有,模板的位置,生成文件的位置可以改变,生成文件的名字可以是变量,这样,每次生成的docx文件名字就会不一样,比如在我的项目当中,我就将身份证号作为文件名称,这样按照模板生成的docx文件不会出现重复。
document_1.write('F:\\{}.docx'.format(emp_full_info.get("identity_card")))
由于Python默认是Unicode编码,所以字符串赋值前要加u,如果是变量赋值,则可以用decode方法,比如:
Year=year.decode(encoding='UTF-8', errors='strict')
Demo具体的源码:
from mailmerge import MailMerge
# 打印模板
template = "F:\\WorkingProve11.docx"
# 创建邮件合并文档并查看所有字段
document_1 = MailMerge(template)
print("Fields included in {}: {}".format(template,document.get_merge_fields()))
document_1.merge(
people_name=u'勒布朗',
identity_card_id='123456789',
begin_work_year='2018',
begin_work_month='7',
department_name=u'洛杉矶湖人',
job_name=u'联盟第一人'
)
document_1.write('F:\\test666.docx')
最后,在制定的F盘下出现了生成的test666.docx文件,打开之后结果如下图:
最后要注意的一点是,如果在同一位置下生成的两份文件名字一样,代码是会报错的。
解决方法有以下几种:
1.运行程序之前,将原来的文件删除。
2.在代码中将文件名称更改。
3.按照上文我所说的,将文件名称改为变量。
希望本文可以帮助到大家。