python 处理 word 文档
python 处理 word
-
简介
- 在web开发过程中,经常需要导出一些word文档,比如运营月报、进货单、收据等。它们的特点是格式都是一致的,只是需要不同的数据进行填充
- docx 和 docxtpl 是比较常见的处理 word 文件的python库。其中前者用于创建一个包含段落、图片、表格、页眉等元素文档,后者使用类似 jinja2 的方式从模板文档生成新的文档
-
安装
pip install python-docx pip install docxtpl # docxtpl 库会依赖jinja2
-
使用
-
情景1:使用
python-docx
从无到有创建一个docx文档,很少这样做,几乎不用关注 -
情景2:使用
docxtpl
库对已有的docx文档模板进行数据填充,极为常见- 处理docx模板文档
- 在docx文档中直接使用jinja2语法,{{ var }},即可将数据render进去
- 循环是高级点的语法,可百度,并无特别难之处
- 对应的主要python代码,大同小异,在py脚本中将数据彻底处理好,render仅做简单数据填充。
from docxtpl import DocxTemplate doc = DocxTemplate("my_word_template.docx") context = {'company_name' : "World company"} doc.render(context) doc.save("generated_doc.docx")
- 处理docx模板文档
-
-
结合python框架的示例代码
-
Django
def export_monthly_report(request, year, index): context = {} # 填充数据 doc = DocxTemplate(app.root_path + '/templates/report_monthly.docx') target_filename = 'monthly_{}_{}.docx'.format(year, index) doc.render(context) file_stream = io.BytesIO() doc.save(file_stream) file_stream.seek(0) response = HttpResponse( file_stream.getvalue(), # use the stream's contents content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", ) response["Content-Disposition"] = 'attachment; filename = "{}"'.format(target_filename) response["Content-Encoding"] = "UTF-8" return response
-
flask
import io from flask import send_file def export_monthly_report(year, index): context = {} # 填充数据 doc = DocxTemplate(app.root_path + '/templates/report_monthly.docx') target_filename = 'monthly_{}_{}.docx'.format(year, index) doc.render(context) file_stream = io.BytesIO() doc.save(file_stream) file_stream.seek(0) return send_file(file_stream, as_attachment=True, attachment_filename=target_filename)
-