以土豆之名,行学习之实

word-docxtpl 库


docxtpl 库介绍

概述

docxtpl 是一个基于 Python 的库,用于在 Word 文档(.docx 格式)中执行模板渲染。它结合了 python-docx 的强大功能和 Jinja2 模板引擎的灵活性,使得动态生成 Word 文档变得简单高效。

主要特性

1. 基于 Jinja2 模板语法

  • 支持变量替换、循环、条件判断等

  • 使用熟悉的 {{ variable }}{% for %}{% if %} 语法

2. 丰富的标签支持

# 变量替换
{{ name }}

# 循环
{% for item in items %}
    {{ item.name }}
{% endfor %}

# 条件判断
{% if condition %}
    {{ value }}
{% endif %}


3. 灵活的上下文管理

  • 支持字典、对象等多种数据源

  • 可以嵌套复杂的数据结构

4. 保持文档格式

  • 保留原文档的所有格式、样式和布局

  • 支持图片、表格等复杂元素的插入

安装方法

pip install docxtpl


实际应用场景

1. 报告生成

  • 周报、月报

  • 项目进度报告

  • 数据分析报告

2. 合同文档

  • 自动填充客户信息

  • 条款选择和处理

3. 证书制作

  • 批量生成证书

  • 自动填充获奖信息

4. 邮件合并

  • 个性化信函

  • 批量邀请函

优点

  1. 简单易用:基于熟悉的 Jinja2 语法

  2. 功能强大:支持复杂的文档结构

  3. 格式保持:完美保留原文档样式

  4. 灵活扩展:支持自定义过滤器和标签

  5. 性能优秀:处理大型文档效率高

注意事项

  1. 模板设计:在 Word 中设计模板时要注意格式规范

  2. 标签位置:确保标签在正确的段落和位置

  3. 特殊字符:注意处理特殊字符和转义

  4. 图片路径:确保图片路径正确且可访问

总结

docxtpl 是一个功能强大且易于使用的 Word 文档模板处理库,特别适合需要批量生成标准化 Word 文档的场景。通过结合 Jinja2 模板引擎的灵活性和 Word 文档的丰富格式支持,它大大简化了动态文档生成的复杂度。

docxtpl 库基本用法代码示例

from docxtpl import DocxTemplate, InlineImage, RichText
from docxtpl import DocxTemplate

# ==================== 1. 简单变量替换 ====================
def simple_variable_demo():
    """基础变量替换示例"""
    doc = DocxTemplate("simple_template.docx")
    
    context = {
        'name': '张三',
        'age': 28,
        'company': '科技有限公司',
        'position': '高级工程师',
        'date': '2024-01-15'
    }
    
    doc.render(context)
    doc.save("output_simple.docx")
    print("简单变量替换完成!")

# ==================== 2. 循环和条件判断 ====================
def loop_and_condition_demo():
    """循环和条件判断示例"""
    doc = DocxTemplate("loop_template.docx")
    
    context = {
        'projects': [
            {
                'name': '电商平台开发', 
                'leader': '李四', 
                'status': 'completed',
                'members': ['张三', '王五', '赵六']
            },
            {
                'name': '移动App设计', 
                'leader': '王五', 
                'status': 'in_progress',
                'members': ['陈七', '孙八']
            },
            {
                'name': '数据分析系统', 
                'leader': '赵六', 
                'status': 'planning',
                'members': ['张三', '李四']
            }
        ],
        'department': '技术部'
    }
    
    doc.render(context)
    doc.save("output_loop.docx")
    print("循环和条件判断完成!")

# ==================== 3. 表格处理 ====================
def table_demo():
    """表格数据处理示例"""
    doc = DocxTemplate("table_template.docx")
    
    context = {
        'users': [
            {'name': '张三', 'email': 'zhangsan@email.com', 'phone': '13800138001', 'department': '技术部'},
            {'name': '李四', 'email': 'lisi@email.com', 'phone': '13800138002', 'department': '市场部'},
            {'name': '王五', 'email': 'wangwu@email.com', 'phone': '13800138003', 'department': '人事部'},
            {'name': '赵六', 'email': 'zhaoliu@email.com', 'phone': '13800138004', 'department': '财务部'}
        ],
        'total_count': 4
    }
    
    doc.render(context)
    doc.save("output_table.docx")
    print("表格处理完成!")

# ==================== 4. 富文本和图片 ====================
def rich_text_and_image_demo():
    """富文本和图片插入示例"""
    doc = DocxTemplate("rich_template.docx")
    
    # 创建富文本
    rich_text = RichText()
    rich_text.add('这是普通文本,')
    rich_text.add('这是加粗文本', bold=True)
    rich_text.add(',这是红色文本', color='FF0000')
    rich_text.add(',这是带下划线的文本', underline=True)
    
    context = {
        'title': '带格式的文档',
        'content': rich_text,
        'author': '文档生成系统',
        # 'logo': InlineImage(doc, 'logo.png', width=100, height=50)  # 图片插入
    }
    
    doc.render(context)
    doc.save("output_rich.docx")
    print("富文本处理完成!")

# ==================== 5. 复杂嵌套结构 ====================
def complex_structure_demo():
    """复杂嵌套数据结构示例"""
    doc = DocxTemplate("complex_template.docx")
    
    context = {
        'company': {
            'name': '某某科技有限公司',
            'address': '北京市海淀区某某路123号',
            'contact': {
                'phone': '010-12345678',
                'email': 'contact@company.com',
                'website': 'www.company.com'
            }
        },
        'employees': [
            {
                'personal_info': {'name': '张三', 'age': 30},
                'work_info': {'position': '经理', 'salary': 15000, 'level': 'P7'},
                'skills': ['Python', 'Java', '项目管理']
            },
            {
                'personal_info': {'name': '李四', 'age': 25},
                'work_info': {'position': '工程师', 'salary': 12000, 'level': 'P5'},
                'skills': ['JavaScript', 'Vue', 'React']
            }
        ]
    }
    
    doc.render(context)
    doc.save("output_complex.docx")
    print("复杂结构处理完成!")

# ==================== 主函数 ====================
if __name__ == "__main__":
    # 执行所有示例
    simple_variable_demo()
    loop_and_condition_demo()
    table_demo()
    rich_text_and_image_demo()
    complex_structure_demo()
    
    print("所有示例执行完成!")


对应的模板文件内容示例

simple_template.docx 内容:

个人基本信息

姓名:{{ name }}
年龄:{{ age }}
公司:{{ company }}
职位:{{ position }}
日期:{{ date }}


loop_template.docx 内容:

{{ department }}项目报告

{% for project in projects %}
项目名称:{{ project.name }}
负责人:{{ project.leader }}
项目成员:{{ project.members | join('、') }}
{% if project.status == 'completed' %}
状态:✅ 已完成
{% elif project.status == 'in_progress' %}
状态:🔄 进行中
{% else %}
状态:📅 规划中
{% endif %}

{% endfor %}


table_template.docx 内容:

员工信息表

{% for user in users %}
{{ user.name }} | {{ user.email }} | {{ user.phone }} | {{ user.department }}
{% endfor %}

总计:{{ total_count }} 人


rich_template.docx 内容:

{{ title }}

正文内容:{{ content }}

生成者:{{ author }}


complex_template.docx 内容:

公司信息:
名称:{{ company.name }}
地址:{{ company.address }}
电话:{{ company.contact.phone }}
邮箱:{{ company.contact.email }}

员工列表:
{% for employee in employees %}
姓名:{{ employee.personal_info.name }}
年龄:{{ employee.personal_info.age }}
职位:{{ employee.work_info.position }}
薪资:{{ employee.work_info.salary }}
级别:{{ employee.work_info.level }}
技能:{{ employee.skills | join('、') }}

{% endfor %}


这个代码示例展示了 docxtpl 的主要功能,包括变量替换、循环、条件判断、表格处理、富文本和复杂数据结构的使用。