python 处理 word 文档

python 处理 word

  1. 简介
    • 在web开发过程中,经常需要导出一些word文档,比如运营月报、进货单、收据等。它们的特点是格式都是一致的,只是需要不同的数据进行填充
    • docx 和 docxtpl 是比较常见的处理 word 文件的python库。其中前者用于创建一个包含段落、图片、表格、页眉等元素文档,后者使用类似 jinja2 的方式从模板文档生成新的文档
  2. 安装
    pip install python-docx
    pip install docxtpl   # docxtpl 库会依赖jinja2
    
  3. 使用
    • 情景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")
      
  4. 结合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)
      
posted @ 2022-02-22 17:05  疯狂列表推导式  阅读(494)  评论(0编辑  收藏  举报