第七期:Word文档自动化——告别重复性文档工作
一、python-docx库介绍
python-docx是Python中处理Word文档的主要库,它可以创建、读取和修改docx格式的Word文档。python-docx支持处理Word文档的各种元素,包括段落、标题、列表、表格、图片、样式、页眉页脚等。虽然它不能处理doc格式的旧版Word文档,但考虑到docx已经成为主流格式,这个限制影响不大。
安装python-docx同样简单,执行pip install python-docx即可。使用python-docx的基本流程与openpyxl类似:创建或打开文档(Document),添加或修改内容(段落、表格等),保存文档。python-docx的API设计直观易用,如document.add_paragraph()添加段落,document.add_table()添加表格,document.add_heading()添加标题等。
二、批量生成文档
批量生成文档是Word自动化最常见的应用场景。在企业中,经常需要生成大量格式相似的文档,如合同、证书、通知信、邀请函等。这些文档的主体内容相同,只是部分信息需要替换,如姓名、日期、金额等。如果手动创建这些文档,需要反复复制粘贴、查找替换,效率低下且容易出错。
以下是一个批量生成邀请函的完整示例:
┌────────────────────────────────────────────────────────────┐
│ from docx import Document│
│ from datetime import datetime│
││
│ def create_invitation(template_path, output_folder, guest_list):│
│“””批量生成邀请函“””│
│for guest in guest_list:│
│# 加载模板│
│doc = Document(template_path)│
││
│# 替换占位符│
│for paragraph in doc.paragraphs:│
│if “{{姓名}}” in paragraph.text:│
│paragraph.text = paragraph.text.replace(“{{姓名}}”, guest[“name”])│
│if “{{日期}}” in paragraph.text:│
│paragraph.text = paragraph.text.replace(“{{日期}}”, guest[“date”])│
│if “{{地点}}” in paragraph.text:│
│paragraph.text = paragraph.text.replace(“{{地点}}”, guest[“location”])│
││
│# 保存文档│
│output_path = f”{output_folder}/邀请函_{guest[‘name’]}.docx”│
│doc.save(output_path)│
│print(f”已生成: {output_path}”)│
││
│ # 使用示例│
│ guests = [│
│{“name”: “张三“, “date”: “2024年3月15日“, “location”: “北京国际会议中心“},│
│{“name”: “李四“, “date”: “2024年3月15日“, “location”: “北京国际会议中心“},│
│{“name”: “王五“, “date”: “2024年3月15日“, “location”: “北京国际会议中心“}│
│ ]│
│ create_invitation(“邀请函模板.docx”, “./output”, guests)│
└────────────────────────────────────────────────────────────┘
三、模板填充技术
模板填充是Word文档自动化的核心技术。python-docx本身不提供模板引擎功能,但可以通过几种方式实现模板填充。最简单的方式是使用字符串替换:遍历文档中的所有段落,查找占位符并替换为实际值。这种方式简单直接,但需要注意占位符可能被Word拆分成多个运行(Run),导致替换失败。
更可靠的方式是使用docxtpl库,它是python-docx的扩展,提供了类似Jinja2的模板语法。使用docxtpl,可以在Word文档中使用{{变量名}}、{% for %}等模板语法,然后在Python代码中传入上下文数据,自动渲染生成文档。这种方式更加灵活强大,支持循环、条件判断等复杂逻辑,适合处理复杂的文档生成需求。以下是一个使用docxtpl的示例:
┌────────────────────────────────────────────────────────────┐
│ from docxtpl import DocxTemplate│
││
│ def generate_contract(template_path, output_path, context):│
│“””使用docxtpl生成合同文档“””│
│# 加载模板│
│doc = DocxTemplate(template_path)│
││
│# 渲染模板│
│doc.render(context)│
││
│# 保存文档│
│doc.save(output_path)│
│print(f”合同已生成: {output_path}”)│
││
│ # 使用示例│
│ contract_context = {│
│“contract_id”: “HT2024001”,│
│“party_a”: “甲方公司名称“,│
│“party_b”: “乙方公司名称“,│
│“amount”: “100000”,│
│“sign_date”: “2024年3月1日“,│
│“items”: [│
│{“name”: “服务项目一“, “price”: “50000”},│
│{“name”: “服务项目二“, “price”: “50000”}│
│]│
│ }│
│ generate_contract(“合同模板.docx”, “合同_HT2024001.docx”, contract_context)│
└────────────────────────────────────────────────────────────┘
四、文档格式化技巧
python-docx提供了丰富的文档格式化功能。在段落级别,可以设置对齐方式、行间距、段前段后间距、首行缩进等。在文字级别,可以设置字体、字号、颜色、加粗、斜体、下划线等。通过合理使用这些格式化功能,可以生成专业美观的文档。以下是一个创建格式化报告的示例:
┌────────────────────────────────────────────────────────────┐
│ from docx import Document│
│ from docx.shared import Pt, Inches, RGBColor│
│ from docx.enum.text import WD_ALIGN_PARAGRAPH│
││
│ def create_formatted_report(title, content, output_path): │
│“””创建格式化的报告文档“””│
│doc = Document()│
││
│# 添加标题│
│heading = doc.add_heading(title, level=0)│
│heading.alignment = WD_ALIGN_PARAGRAPH.CENTER│
││
│# 添加正文段落│
│for para_text in content:│
│para = doc.add_paragraph()│
│para.paragraph_format.first_line_indent = Inches(0.3)│
│para.paragraph_format.line_spacing = 1.5│
│run = para.add_run(para_text)│
│run.font.name = “宋体“│
│run.font.size = Pt(12)│
││
│# 添加表格│
│table = doc.add_table(rows=3, cols=3)│
│table.style = “Table Grid”│
│headers = [“项目“, “数量“, “金额“]│
│for i, header in enumerate(headers):│
│cell = table.rows[0].cells[i]│
│cell.text = header│
│cell.paragraphs[0].runs[0].font.bold = True│
││
│doc.save(output_path)│
│print(f”报告已生成: {output_path}”)│
││
│ # 使用示例│
│ create_formatted_report(“月度工作报告“, [“本月工作总结…”, “下月工作计划…”], “工作报告.docx”)│
└────────────────────────────────────────────────────────────┘
夜雨聆风
