乐于分享
好东西不私藏

Day2:Word批量排版与文档生成

Day2:Word批量排版与文档生成

Day2:用AI + Python批量生成Word文档,告别一个个复制粘贴


一、先说一个让人崩溃的场景


公司年终了,你需要给 200 个员工发绩效通知书。

内容几乎一样——只有姓名、部门、评级、奖金数字不同。

你打开 Word,改了第一份,保存。

打开第二份……

三个小时后,你做到第 47 份,眼睛开始发花。


或者是这样:

领导让你把上周的会议纪要整理成规范格式,统一字体、统一段落间距、统一标题样式,发给各部门负责人——每个人一份,抬头换成各自的名字

你打开第一份 Word,开始手动改格式。

然后发现,你有 12 份要改。


这两件事的本质一样:有规律的重复 → 可以完全自动化。

今天我们来干掉它。


二、Word 自动化能做什么?


在职场中,Word 批量处理主要覆盖两类场景:

场景一:批量生成文档(模板填充)

有一份模板,数据来自 Excel 表格,每行生成一份文档。

典型应用:

  • 员工绩效通知书 / 录用通知函
  • 批量合同 / 协议
  • 客户报告 / 对账单
  • 学生成绩单 / 奖状

场景二:批量格式化文档(统一排版)

有一批乱格式的 Word 文件,需要统一样式、字体、段落间距。

典型应用:

  • 多人协作文档统一排版
  • 历史存档文件标准化
  • 批量添加页眉页脚、水印
  • 批量替换某段文字或关键词

今天我们把这两类都讲透,各给一个可直接跑的脚本。


三、环境准备(5分钟搞定)


今天用到的 Python 库:

pip install python-docx openpyxl
  • **python-docx**:读写 Word 文档的核心库
  • **openpyxl**:读取 Excel 数据(Day1 已装过)
没有 Python 的同学,先去看系列总览篇里的环境安装说明,5 分钟就能搞定。

四、实战一:批量生成通知书(模板填充)


4.1 准备模板

先建一个 Word 模板文件 template.docx,内容如下:

{{姓名}} 同学:您好!经公司绩效评估委员会审定,您本季度绩效等级评定为【{{等级}}】。根据公司薪酬政策,您本季度绩效奖金为:{{奖金}}元。请于 {{发放日期}} 前登录系统确认。人事部{{日期}}

其中 {{姓名}}{{等级}} 等是占位符,我们用脚本把它们替换成真实数据。


4.2 准备数据表

新建一个 Excel 文件 员工名单.xlsx,格式如下:

| 姓名 | 等级 | 奖金 | 发放日期 |

|——|——|——|——–|

| 张三 | A | 8000 | 2024-04-15 |

| 李四 | B+ | 6000 | 2024-04-15 |

| 王五 | A+ | 12000 | 2024-04-15 |


4.3 直接可用的脚本

新建文件 batch_word_gen.py,粘贴以下代码:

import osfrom docx import Documentfrom openpyxl import load_workbookfrom copy import deepcopy# ===== 配置区(按需修改)=====TEMPLATE_FILE = "template.docx"      # 模板文件路径EXCEL_FILE = "员工名单.xlsx"          # 数据表路径OUTPUT_DIR = "output_docx"           # 输出文件夹# ==============================def replace_text_in_doc(doc, replacements):    """替换 Word 文档中的占位符"""    # 替换段落中的文字    for para in doc.paragraphs:        for key, value in replacements.items():            if key in para.text:                for run in para.runs:                    if key in run.text:                        run.text = run.text.replace(key, str(value))    # 替换表格中的文字(如果模板里有表格)    for table in doc.tables:        for row in table.rows:            for cell in row.cells:                for para in cell.paragraphs:                    for key, value in replacements.items():                        if key in para.text:                            for run in para.runs:                                if key in run.text:                                    run.text = run.text.replace(key, str(value))    return docdef main():    # 创建输出文件夹    os.makedirs(OUTPUT_DIR, exist_ok=True)    # 读取 Excel 数据    wb = load_workbook(EXCEL_FILE)    ws = wb.active    headers = [cell.value for cell in ws[1]]  # 第一行是表头    print(f"读取到字段:{headers}")    success_count = 0    fail_count = 0    for row_idx, row in enumerate(ws.iter_rows(min_row=2, values_only=True), start=2):        if all(v is None for v in row):            continue  # 跳过空行        # 构建替换字典:{{字段名}} → 对应值        replacements = {f"{{{{{col}}}}}": str(val or "") for col, val in zip(headers, row)}        try:            # 每次从模板加载一份新文档(防止串改)            doc = Document(TEMPLATE_FILE)            doc = replace_text_in_doc(doc, replacements)            # 用"姓名"字段命名文件,没有就用行号            name = replacements.get("{{姓名}}", f"row_{row_idx}")            out_path = os.path.join(OUTPUT_DIR, f"通知书_{name}.docx")            doc.save(out_path)            print(f"✅ 已生成:{out_path}")            success_count += 1        except Exception as e:            print(f"❌ 第 {row_idx} 行处理失败:{e}")            fail_count += 1    print(f"\n完成!成功 {success_count} 份,失败 {fail_count} 份")    print(f"文件保存在:{os.path.abspath(OUTPUT_DIR)}")if __name__ == "__main__":    main()

运行:

python batch_word_gen.py

200 份通知书,10 秒钟全部生成完毕。


五、实战二:批量统一文档格式


这个场景更常见:你从各部门收到一堆 Word 文件,字体、字号、段落间距都不统一,需要统一成公司规范格式。

5.1 脚本目标

  • 统一正文字体:宋体,12pt
  • 统一段落间距:段前 0pt,段后 6pt,行距 1.5 倍
  • 统一标题一样式:黑体,16pt,加粗
  • 批量处理一个文件夹里的所有 `.docx` 文件

5.2 脚本代码

新建文件 batch_format.py

import osfrom docx import Documentfrom docx.shared import Pt, Cmfrom docx.enum.text import WD_LINE_SPACINGfrom docx.oxml.ns import qn# ===== 配置区 =====INPUT_DIR = "input_docx"    # 待处理文件夹OUTPUT_DIR = "formatted"    # 输出文件夹# ==================def format_paragraph(para, style="body"):    """格式化段落"""    from docx.shared import RGBColor    pf = para.paragraph_format    pf.space_before = Pt(0)    pf.space_after = Pt(6)    pf.line_spacing_rule = WD_LINE_SPACING.MULTIPLE    pf.line_spacing = 1.5    for run in para.runs:        if style == "heading":            run.font.name = "黑体"            run.font.size = Pt(16)            run.font.bold = True            # 设置中文字体            run._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')        else:            run.font.name = "Times New Roman"            run.font.size = Pt(12)            run.font.bold = False            run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')def format_document(input_path, output_path):    """格式化单个文档"""    doc = Document(input_path)    for para in doc.paragraphs:        if not para.text.strip():            continue  # 跳过空段落        # 根据段落样式名判断是否为标题        style_name = para.style.name.lower()        if "heading" in style_name or "标题" in style_name:            format_paragraph(para, style="heading")        else:            format_paragraph(para, style="body")    doc.save(output_path)def main():    os.makedirs(OUTPUT_DIR, exist_ok=True)    if not os.path.exists(INPUT_DIR):        print(f"❌ 找不到输入文件夹:{INPUT_DIR}")        return    files = [f for f in os.listdir(INPUT_DIR) if f.endswith(".docx")]    if not files:        print("❌ 没有找到 .docx 文件")        return    print(f"找到 {len(files)} 个文件,开始格式化...")    for fname in files:        input_path = os.path.join(INPUT_DIR, fname)        output_path = os.path.join(OUTPUT_DIR, fname)        try:            format_document(input_path, output_path)            print(f"✅ 已处理:{fname}")        except Exception as e:            print(f"❌ 处理失败 {fname}:{e}")    print(f"\n完成!格式化文件保存在:{os.path.abspath(OUTPUT_DIR)}")if __name__ == "__main__":    main()

运行:

python batch_format.py

六、用 AI 辅助生成脚本(不会 Python 也能用)


拿到上面的脚本之后,你可能会遇到:“我的模板跟你举例的不一样怎么办?”

最省力的做法是:直接把你的需求丢给 AI,让它写。

提示词模板

我有一份 Word 模板文件,里面有以下占位符:[粘贴你的占位符列表]数据来源是 Excel 文件,字段有:[粘贴 Excel 表头]请帮我写一个 Python 脚本,实现:1. 读取 Excel 中每一行数据2. 将数据填入 Word 模板对应占位符3. 每行生成一份 Word 文件,以"姓名"字段命名4. 保存到 output 文件夹用 python-docx 和 openpyxl 库实现。

把这段提示词贴给任何一款主流 AI,它能直接给你一份可运行的脚本。


七、进阶技巧:批量转 PDF + 批量发邮件


生成了 Word 文件之后,如果还需要:

1. 批量转 PDF(Windows)

import subprocessdef word_to_pdf(word_path, pdf_dir):    subprocess.run([        "soffice", "--headless", "--convert-to", "pdf",        "--outdir", pdf_dir, word_path    ])
需要安装 LibreOffice,免费。

2. 批量发送邮件(搭配 Day4)

生成好的通知书,可以直接配合我们系列 Day4 的邮件自动化脚本,实现文件生成 → 自动发邮件的全流程。

这就是自动化的美妙之处:每个脚本可以单独用,也可以串起来组成一条完整的工作流。