使用 Python Docxtpl 生成 Word 文档并返回 HTTP 响应

在这篇文章中,我们将一起学习如何使用 Python 的 docxtpl 库来动态生成 Word 文档,并将其返回作为 HTTP 响应。以下是整个流程的简要概述:

流程概述

我们将按照以下步骤进行操作:

步骤 描述
1 创建基本的 Flask 应用
2 安装所需的库 docxtpl
3 创建 Word 模板
4 编写代码以加载模板并填充数据
5 返回 HTTP 响应下载文档

第一步:创建基本的 Flask 应用

首先,我们需要创建一个基本的 Flask 应用。Flask 是一个流行的 Python Web 框架。

安装 Flask

在终端运行以下命令来安装 Flask:

pip install Flask

创建 Flask 应用

新建一个文件 app.py 并写入以下代码:

from flask import Flask, send_file
app = Flask(__name__)

@app.route('/')
def home():
    return "欢迎使用 Word 文档生成器"

上述代码创建了一个简单的 Flask 应用,并定义了一个路由 /。当用户访问此路由时,会显示一条欢迎信息。

第二步:安装所需的库 docxtpl

接下来,安装 docxtpl 库,这是一个用于创建动态 Word 文档的 Python 库。

安装命令

在终端输入:

pip install docxtpl

此命令会将 docxtpl 库安装到您的环境中。

第三步:创建 Word 模板

在生成 Word 文档之前,我们需要一个模板文件。创建一个名为 template.docx 的文档,这个文档可以包含一些你希望动态填充的数据,比如:

尊敬的 {{ name }}:

感谢您使用我们的服务!

祝好,
团队

在这个模板中,{{ name }} 是一个变量,在程序运行时会被实际的值替代。

第四步:编写代码以加载模板并填充数据

现在,我们来编写代码,使其能够加载模板,并将数据填入。

更新 app.py

app.py 文件中添加下面的代码:

from flask import Flask, render_template_string, send_file
from docxtpl import DocxTemplate
import os

app = Flask(__name__)

@app.route('/')
def home():
    return "欢迎使用 Word 文档生成器"

@app.route('/generate-doc')
def generate_doc():
    # 加载 Word 模板
    doc = DocxTemplate("template.docx")
    
    # 模板中要填充的数据
    context = {
        'name': '小白'  # 这里可以动态传递数据
    }
    
    # 填充数据到模板中
    doc.render(context)
    
    # 临时保存生成的文档
    output_filename = "output.docx"
    doc.save(output_filename)

    # 返回生成的文件作为 HTTP 响应
    return send_file(output_filename, as_attachment=True)

代码解释

  1. 导入模块

    from docxtpl import DocxTemplate
    

    这行代码是导入 docxtpl 中的 DocxTemplate 类,用于加载和处理 Word 模板。

  2. 生成文档的路由:

    @app.route('/generate-doc')
    

    定义了另一个路由 /generate-doc,当访问此路由时将生成 Word 文档。

  3. 加载模板:

    doc = DocxTemplate("template.docx")
    

    加载之前创建的模板文件 template.docx

  4. 创建上下文:

    context = {
        'name': '小白'
    }
    

    创建一个包含要填充数据的字典 contextname 的值为 小白

  5. 渲染模板:

    doc.render(context)
    

    使用 context 中的数据填充模板。

  6. 保存生成的文档:

    doc.save(output_filename)
    

    将填充后的文档保存为 output.docx

  7. 返回 HTTP 响应:

    return send_file(output_filename, as_attachment=True)
    

    使用 send_file 方法将生成的文档发送给用户,并设置 as_attachment=True 使其作为下载文件。

第五步:运行 Flask 应用

确保在终端中运行 Flask 应用:

python app.py

访问 ` 就可以下载生成的文档了。

总结

在这篇文章中,我们从头到尾实现了一个功能齐全的 Flask 应用,能够生成并下载一个动态填充的 Word 文档。以下是代码的类图,使用 Mermaid 语法表示:

classDiagram
    class FlaskApplication {
      +home()
      +generate_doc()
    }
    class DocxTemplate {
      +DocxTemplate(template_path)
      +render(context)
      +save(output_path)
    }

我们通过简单的步骤和代码注释,理解了如何利用 docxtpl 和 Flask 提供动态文档生成功能。希望你能通过这篇文章获得启发并深入学习 Python Web 开发!