tips:
由于项目是工程上的使用,不仅需要对采集的数据进行分析,也需要输出报表,使用程序输出报表极大的简化了报表制作流程。
python-docx
python-docx是一个用于创建和更新Microsoft Word(.docx)文件的Python库。文档地址
docxtpl
主要包含两个包,分别是python-docx用于读取,编写和创建子文档。jinja2用于管理插入模板docx的标签。通过预先设定的模板文件,生成需要的文件。文档地址
项目上的Word报表定制化比较高。通常由用户提供模板,我们这边只需要在对应位置填写数据。因此项目上采用docxtpl
来定制化Word报表
安装pip install docxtpl
简单使用,更多详细内容请看官方文档。
新建测试模板test.docx
,设置模板样子,并填入相关参数。
编写渲染测试代码test.py
from docxtpl import DocxTemplate, InlineImagefrom docx.shared import Mm# 读取指定位置的模板文件doc = DocxTemplate("test.docx")# 渲染的内容context = { # 标题 'title': "人员信息", # 表格 'table': [ {"name": "小李", "age": 11}, {"name": "小张", "age": 21}, {"name": "小张", "age": 20}, {"name": "小张1", "age": 10}, {"name": "小张2", "age": 30}, {"name": "小张3", "age": 40}, ], # 页眉 'header': 'xxx公司人员信息管理', # 页脚 'footer': '1', # 图片 'image': InlineImage(doc, 'test.jpg', height=Mm(10)),}# 渲染模板doc.render(context)# 保存渲染的文件doc.save("generated_doc.docx")
关于表格动态合并、表格设置可以参考这里
测试代码
from docxtpl import DocxTemplate, InlineImagefrom docx.shared import Mmfrom flask import Flaskdef write(): path = "generated_doc.docx" # 读取指定位置的模板文件 doc = DocxTemplate("test.docx") # 渲染的内容 context = { # 标题 'title': "人员信息", # 表格 'table': [ {"name": "小李", "age": 11}, {"name": "小张", "age": 21}, {"name": "小张", "age": 20}, {"name": "小张1", "age": 10}, {"name": "小张2", "age": 30}, {"name": "小张3", "age": 40}, ], # 页眉 'header': 'xxx公司人员信息管理', # 页脚 'footer': '1', # 图片 'image': InlineImage(doc, 'test.jpg', height=Mm(10)), } # 渲染模板 doc.render(context) # 保存渲染的文件 doc.save(path) return pathapp = Flask(__name__)@app.route('/testWord', methods=["GET"])def test_word(): """ 测试输出word :return: """ path = write() return pathif __name__ == '__main__': app.run()
启动app,访问http://127.0.0.1:5000/testWord
返回生成路径generated_doc.docx
。然后配合nginx转发即可下载文件
联系客服