10

利用python批量出报告

 3 years ago
source link: https://www.capallen.top/2019/%E5%88%A9%E7%94%A8python%E6%89%B9%E9%87%8F%E5%86%99%E6%8A%A5%E5%91%8A.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

最近单位需要批量输出报告,好在这些报告的整体模板相同,只有一些跟用户相关的信息需要替换。几千份的重复工作,还是交给Python去处理吧。

本文的技术路径为:利用docxtpl对word模板文件进行变量替换,然后利用 将word转换为pdf。

本文代码应用环境如下:

* Windows 7
* Python 3.7
* docxtpl-0.5.17

Word文档处理

  • 主要用docxtpl库实现。官方文档

  • 直接pip install docxtpl即可,会自动安装依赖库:docxjinja2

模板文档准备

如下所示,将需要进行变量替换的位置用两对大括号括起来,并在其中添加变量名,这是后续能通过python识别替换的关键。

A23KQx.png

表格的变量设置比较麻烦,可以查看官方github,里面有很多示例代码,随用随取。

设置表格变量的时候,有两个关键,一个是 ,一个是,其中行用字段tr(row)表示,列用字段tc(column)表示。

如下表中所示,我们通过构建列表循环 和 调用字典key的方式,对表格中的各个项进行填充。

A2GUqf.png

from docxtpl import DocxTemplate,InlineImage
from docx.shared import Mm
import jinja2

#读取模板文档
tpl = DocxTemplate('自主招生大数据报告模板.docx')

#替换word中的变量
#字典中的key为变量名,value为要替换的值
context = {
'stu_id':123,
'stu_phone':13612341234,
'stu_province':'河北',
'stu_grade':'高二',
'stu_wenli':'理科',
'stu_school':'南宫中学',
'stu_university':'西安交通大学',
'stu_prize_1':'化学省一',
'image_1':InlineImage(tpl,'E:/wallpapers/1.jpg',width=Mm(120)),
'items' : [
{'university' : '西安交通大学', 'major' : '电气工程,能源动力','year':2018, 'prize' : '数学省一','nums':200 },
{'university' : '复旦大学', 'major' : '金融学', 'year':2018,'prize' : '数学省三','nums':20 },
{'university' : '北京理工大学', 'major' : '兵器学', 'year':2018,'prize' : '物理省二','nums':2 },
],
}

#输出
tpl.render(context)
tpl.save('output/自主招生报告.docx')

Word转PDF

通过Windows Com组件(win32com),调用Word服务(Word.Application),实现Word到PDF文件的转换。因此,要求该Python程序需要在有Word服务(可能至少要求2007版本)的Windows机器上运行。

参考:批量转换Word文件为PDF文件

import win32com.client

#WdSaveFormat指令,17表示转为PDF
#更多信息可以查看:https://docs.microsoft.com/zh-cn/office/vba/api/word.wdsaveformat
wdFormatPDF = 17
word = win32com.client.Dispatch('Word.Application')
#打开文档,绝对地址
doc = word.Documents.Open('F:\\0 zizhuzhaosheng\\docs\\test.docx')
#输出文档路径,绝对地址
doc.SaveAs('F:\\0 zizhuzhaosheng\\docs\\test.pdf', FileFormat=wdFormatPDF)
#退出
doc.Close()
word.Quit()

知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK