如何在Python中将数据插入到Word模板中生成一份Word文档

   在一些的项目开发中,会有一些生成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.按照上文我所说的,将文件名称改为变量。

希望本文可以帮助到大家。

你可能感兴趣的:(Python语言,后端开发)