前言

在工作中,有一项是将网站上的报告转化为docx文档,并且还要求需要具备特殊的样式。

若是人工进行复制粘贴,还要调整样式,耗时费力还易出错。并且这一项工作的频度还不定,可能一天四次或者一周一次。所以就开始思考是否能将其自动化。

最终用python的docxtpl库实现了Word文档自动化。

docxtpl介绍

docxtpl是python的一个包,主要通过对docx文档模板的加载,实现对docx的修改。

主要依赖:

  • python-docx :读写doc文本
  • jinja2:管理插入到模板中的标签

与python-docx不同的是,python-docx主要是用来创建文档,而docxtpl主要是用来修改文档。

可以通过以下命令进行安装。

1
pip install docxtpl

核心思想

完形填空。

实现思路

  1. 设计模板:按照要求,设计好模板docx文档。
  2. 规范数据:整理所需信息字段,规范api数据信息格式。
  3. 模板挖空:将docx文档中需要替换的内容使用两个花括号进行标注。
  4. 代码编写:请求api获得数据、数据对应、模板渲染。
  5. 导出文档。

模板准备

如下图所示,在设计好文档样式后,在文档模板中将想要替换的信息用花括号表示。

sZ4Kxg.png

请求api

这一步主要是为了获得填充数据。

详情可见api请求

核心代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from docxtpl import DocxTemplate, InlineImage, RichText

# 指定模板文档
tpl = DocxTemplate('G:/template.docx')

# 数据对应
context = {
'category': category,
'title_img': title_img,
'vul_type': vul_type,
'cve': cve,
'manufacturer': data['data']['file']['manufacturer']
}

# 模板渲染
tpl.render(context, autoescape=True)

# 文档保存
tpl.save('G:/xxxxxx.docx')

插入图片

本次实践过程中,需要插入在线图片,所以有了第一行的代码。

插入图片的功能主要是用到**InlineImage()**函数,其中width=Mm(140)是用以调整图片的大小。

1
2
urllib.request.urlretrieve('https://xxx.png', 'img_name.png')
title_img = InlineImage(tpl, 'img_name.jpeg', width=Mm(140))

写好以上代码后,直接在数据对应时使用title_img这个变量即可将图片渲染进去。

总结

学会以上内容后,就能够实现简单的文档自动化生成。关于目录、章节增减、常见问题等会在进阶篇讲到。