工作中遇到的一个问题,要把一个单机软件导出的A报告(Word格式的)的数据放到B报告(同样也是Word格式的),这个步骤一直是手工复制粘贴实现,极费时间。想过用OCR识别,看了一下价格有点抵不住,毕竟这个量不少,于是打算用python操作Word,刚好学习浅尝一下python。之前没接触过python,花了几天缝缝补补弄了一个并打包Pyinstaller打包成exe,这样的好处是拷贝到别人电脑也能用,不用考虑对方电脑有没有python环境,因为还得下载依赖库。

用的python docx以及python docx template,前者是一个可以读取、修改、创建Word的库,后者是一个可以替换Word制定内容的库。

1
2
3
4
5
# Word模板

亲爱的{{user}}您好:
您在{{url}}上的邮件地址{{mail}}需要被确认,以便您接收通知消息。

1
# 表格循环替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 渲染替换代码
from docxtpl import DocxTemplate

tpl = DocxTemplate('template/SJ046-02-XXXX-检测报告.docx')

context={
'user':'likasi',
'url':'httpblog.likasi.top',
'mail':'yyyy@qq.com',
'res':[
{
'serial':'001',
'number':'YNZH109203810',
'name':'张三',
'gendr':'男',
'type':'放射卫生',
'value':'0.03'
},
{
'serial':'002',
'number':'YNZH109203811',
'name':'李丽',
'gendr':'女',
'type':'职业卫生',
'value':'0.02'
},
]
}

path = "E:\\ReportReplace\\output\\"

tpl.render(context)

tpl.save(path+'relace.docx')

思路就是通过python docx读取Word内容,然后正则匹配出来,封装成想要渲染的context数据,再用python docx template渲染。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 读取数据代码
import docx

file=docx.Document('XXXX.docx')

# 输出每一段的内容
para_list = []
# 段落
for para in file.paragraphs:
para_list.append(para.text)

# 上半部表 按行读取
table_list_top = []
for table in file.tables:
for row in table.rows:
for cell in row.cells:
table_list_top.append(cell.text)

# 下半部表 按列读取
table_list_bottom = []
for table in file.tables:
for column in table.columns:
for cell in column.cells:
table_list_bottom.append(cell.text)

# 正则匹配
...

# 封装为dict
...

以上都是只截取了部分代码,因为都放上也没有意义,这个还得根据实际文档来拿数据。在你Word模板设置字体字号就设置好,替换后的也就是那个字体和字号格式等。

人生苦短,我选python也不是没有道理的,各种库拿来就是用啊,还是很方便的。