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 的邮件自动化脚本,实现文件生成 → 自动发邮件的全流程。
这就是自动化的美妙之处:每个脚本可以单独用,也可以串起来组成一条完整的工作流。
夜雨聆风