使用模板生成周报的步骤:
1、使用 docx 库编辑模板文档
2、将段落中的关键词替换成每周需要改变的参数
3、将统计内容插入表格中
4、生成统计图并插入模板文件
5、将模板文件另外输出
本篇博客会涉及以下几个知识点:
1、使用 docx 依赖编辑模板文件
2、如何替换 word 文档中的关键字
3、在 word 中添加图片
4、将统计内容插入表格
本篇博客会涉及到的依赖库:
docx
1、使用 docx 库打开模板文档
此步骤会涉及到 docx 安装以及该模块的基本使用。
安装
直接使用以下命令进行安装:
sudo pip3 install docx
然后打开 python 的交互交互界面,如果出现如下错误:
则需要使用以下命令再安装一次:
sudo pip3 install python-docx
然后 import docx 不报错则表示安装成功。
docx 文档编辑 word 文档
在 python3 里,docx 编辑 word 文档,有如下几个方法:
每一段文字都是 paragraph,每一个表格都是 table。
编辑文字
import docx
path = "e:/test.docx"
document = docx.Document(path)
paragraphs = document.paragraphs
for para in paragraphs:
print(para.text)
这样就打印出了每一段的文字,如果是想要替换,则是如下操作:
for para in paragraphs:
para.text = 'test'
这样,每一段文字都会被置换成 test 字符串,如果是想要替换某个关键词,在后面的操作中会涉及。
编辑表格
tables = document.tables
对于每一个表格,要涉及的操作都是每个表格内的格子,这个在后面插入数据的地方详细讲述。
因为本文做的是使用模板,所以只讲表格内字符串的替换以及插入操作,不涉及表格的添加与删除。
以上就是本文中涉及 docx 编辑表格需要用到的一些知识点。
2、将段落中的关键词替换成每周需要改变的参数
第一个步骤后中,介绍 docx 编辑文档,直接使用
paragraph.text = 'replace string'
替换整段文字,如果是在一个段落中,模板文件需要修改的只是每个段落中的几个参数,那么我们如果去修改呢?
首先,我们要了解一下,每个段落的构成。
在一个段落中,这个段落并不是一个整体,而是由一个个叫做 run的东西组成。
为什么一个段落会分解成一个个的 run 呢,因为在一个段落里,每一个字符都有可能会被单独加上一些属性,比如字号、字体、颜色、背景等参数。
比如在第一个段落中,文本信息为:
逐个打印出 run 的 text 文本。
而我们通过替换每个 run 中的字符,可以保留下 run 中的这些属性,而只替换文字内容。
比如原始本文内容为:
以下是替换方法:
test = paragraphs[2]
for run in test.runs:
if 'n' in run.text:
run.text = run.text.replace("n", str(3))
if 'hour' in run.text:
run.text = run.text.replace("hour", str(18))
然后打印出替换后的内容:
该段落中,关键字部分已经被替换。
3、将统计内容插入表格中
接下来介绍一下表格的基本组成结构。
每一个 table由一个个的 cell 组成,这个特点和 Python 操作 Excel 的方式有点相似,而在每一个cell里要添加内容,可以使用到前面的 段落paragraph 以及之下的 run。
而对于每一个 cell,计数都是从0 开始,也就是说,要定位到表格的第一个格子,是 cell(0, 0)。
以下是向格子中添加内容的方法:
table = document.tables[0]
run = table.cell(0,0).paragraphs[0].add_run('this is add string')
以上代码片段就向 table 的第一个格子添加了一段测试字符串。
如果需要将该 run 的字符设置字号大小,则使用如下代码:
run.font.size = docx.shared.Pt(18)
4、生成统计图并插入模板文件
要生成报表,比如折线图,柱状图,饼图等,这个内容我会另开一篇博文,这里只讲述如果插入模板文件。
在将图片插入模板文件的过程中,尝试了一些方法,比如直接插入,比如插入 表格的 cell 中,这就涉及几个问题:
如何定位图片的插入地方,插入图片后的排版。
如果是直接通过段落,也就是 paragraph 来定位,会有一个问题,插入图片后显示不全,也就是说字体与图片的悬浮问题。
当然,直接在 word 文档中插入也有这个问题,可以通过将段落改为 单倍行距的方式来解决。
但是通过向 table 的 cell 中插入图片可以一次性解决这个问题。
但是需要注意一点,就是需要将表格 table 设置为隐藏边框。
以下是插入图片的方法:
run = document.tables[1].cell(0, 0).paragraphs[0].add_run()
run.add_picture(image_path, width=Inches(5.25))
其中, width 这个参数是用来设置 图片的大小。
5、将模板文件另外输出
通过以上的操作步骤生成一个新的周报文件以后,需要将其另外输出到一个地址,而原有模板文件不会改变。
以下是输出操作:
document.save(document_path)