赛博红兔的科技博客

CyberHongTu shares news, insights, and musings on fascinating technology subjects.


和我一起玩Python:49. Python处理Word文档的宝典docxtpl模块

大家好,我是赛博红兔。上一集聊了处理Excel的openpyxl库。今天我们再来看看Python里非常实用的办公自动化的库——docxtpl,它是专门用来将 Word 模板与Python数据结合,实现自动化生成Word文档的功能。适合批量生成简历、通知、合同、报告等等办公文档。首先,我们需要确保安装了第三方库docxtpl。在命令窗口用 pip安装即可:pip install docxtpl。

  1. 基本变量替换

首先,我们来看看最基本的变量替换。我们这里有一个开课通知的模板。保存为 template1.docx。

尊敬的 {{ name }}:

您好!您已成功报名参加 {{ course }} 课程,开课时间为 {{ date }}。

请您准时参加。如有问题请联系管理员。

此致  
敬礼!

这就是我们要用的模板文件,里面用的是 {{ }} 括起来的地方,我们可以用来填充不同的变量。接下来,我们来看怎么用Python给模板“填充”数据并且生成最终的 Word 文件。我们先导入docxtpl,接着用DocxTemplate把名字叫 “template1.docx” 的 Word 文件加载进来,创建一个模板对象。然后,创建一个字典用于保存要替换到模板里的数据。比如,这里的姓名、课程名称和日期。用render方法把 context 这个字典里的内容填充进模板里对应的位置。然后用save方法保存新的文档。运行之后,就会在当前目录下生成一个 output.docx,里面的 {{ name }}、{{ course }} 等就会被自动替换为你定义的变量内容。是不是超级方便?

from docxtpl import DocxTemplate

# 加载模板

doc = DocxTemplate("template1.docx")

# 定义上下文变量

context = {

    "name": "小红",

    "course": "Python全栈开发",

    "date": "2025年4月1日"

}

# 渲染模板

doc.render(context)

# 保存新文档

doc.save("output.docx")

print("Word文档已生成!")
  1. 批量生成 Word 文件

当然,docxtpl可以这样批量生成多个文档,这也是我们办公自动化里最常用的应用了,比如批量生成订单、成绩单、证明信、合同等等。你们看,我们这里有整个班学生的成绩,一当然也可以从Excel表格里读取啊不用想我这里为了演示都放在Python脚本里。我们来运行一下,几秒钟搞定几十上百份Word文件,不香吗?

students = [

    {"name": "小红", "course": "Excel自动化", "date": "2025-04-01"},

    {"name": "小明", "course": "Python入门", "date": "2025-04-05"},

    {"name": "小强", "course": "数据分析", "date": "2025-04-08"},

    {"name": "小刚", "course": "前端开发", "date": "2025-04-09"},

    {"name": "小芳", "course": "Java基础", "date": "2025-04-10"},

]

for student in students:

    doc = DocxTemplate("template1.docx")

    doc.render(student)

    doc.save("output.docx")

print("批量生成完毕!")
  1. 条件判断(if-else)

其实有些朋友可能看出来了,docxtpl要求的Word模板格式啊是不是和网页模板 Jinja2 很像?是的,其实还有更多的Jinja2功能。比如说,支持 Jinja2 的条件判断语法可以根据变量显示不同内容,非常适合生成个性化文档。我们这里有一份考试成绩通知单。

{{ name }} 同学:

{% if score >= 90 %}
祝贺你!你在考试中取得了优异成绩!
{% elif score >= 60 %}
继续努力,你在考试中表现不错!
{% else %}
你需要加把劲,下次考试争取更好成绩!
{% endif %}

可以看到,我们可以按照学生不同的成绩区间来生成不同的老师的评语。这里的代码就是Jinja2的语法,我们就不展开了,用的时候记一下就可以了。比如,我们这里小红,考了95分,我们运行一下看看新生成的通知单是什么样子?是不是对老师来说很方便呢?

doc = DocxTemplate("template2.docx")

context = {

    "name": "小红",

    "score": 95

}

doc.render(context)

doc.save("output.docx")

print("Word文档已生成!")
  1. for循环:生成动态列表或表格

不光是if-else,我们还可以用for循环在Word里生成一连串表单。

学生成绩单:

{% for stu in students %}
- 姓名:{{ stu.name }},数学:{{ stu.math }},语文:{{ stu.chinese }},英语:{{ stu.english }}
{% endfor %}

比如,我们想要在Word模板里生成一长串包括学生姓名和各科成绩的这么一个表单,就可以用Jinja2的for循环语句来实现,看起来和Python的语法挺像的。在Python脚本里,只要把学生信息填写到字典里,运行之后就可以生成这么一长串的表单啦。

data = {

    "students": [

        {"name": "小红", "math": 90, "chinese": 88, "english": 92},

        {"name": "小明", "math": 85, "chinese": 81, "english": 89},

        {"name": "小强", "math": 78, "chinese": 85, "english": 90},

        {"name": "李雷", "math": 92, "chinese": 90, "english": 85},

        {"name": "韩梅", "math": 88, "chinese": 92, "english": 90},

        {"name": "张三", "math": 70, "chinese": 75, "english": 78},

        {"name": "李四", "math": 83, "chinese": 86, "english": 80},

        {"name": "王五", "math": 95, "chinese": 91, "english": 93},

        {"name": "赵六", "math": 60, "chinese": 65, "english": 70},

        {"name": "小花", "math": 89, "chinese": 87, "english": 90},

    ]

}

doc = DocxTemplate("template3.docx")

doc.render(data)

doc.save("output.docx")

print("Word文档已生成!")

好啦,docxtpl模块就先学到这里!它是一个非常强大的 Word 自动化工具,它能让我们快速、批量、高质量地生成 Word 文件。不管你是搞行政的、教务的、人力的,还是做技术的,如果有模板文档要批量处理,掌握 docxtpl 就能大大提升效率!本频道将同步在B站和油管上更新,如果你喜欢我的内容,请不要忘记点赞、订阅和分享,这样就不会错过我更新的内容,欢迎在评论区提出你的想法和建议。今天就到这里,再见吧!



Leave a comment