一、思路
- 1. 做一份 模板.docx,把会变动的地方写成占位符:
{{姓名}}、{{部门}}、{{金额}}。 - 2. 准备一张 数据表.xlsx(或 csv),每行一个人,列名 = 占位符名。
- 3. 循环每行:复制模板 → 把占位符替换成真实值 → 另存为「姓名.docx」。
二、核心代码
import pandas as pd
from docx import Document
data = pd.read_excel("名单.xlsx") # 列:姓名/部门/金额
tpl = Document("模板.docx")
for _, row in data.iterrows():
doc = Document("模板.docx") # 每次重新打开,避免污染
# 替换正文段落
for p in doc.paragraphs:
for col in data.columns:
iff"{{{{{col}}}}}"in p.text:
p.text = p.text.replace(f"{{{{{col}}}}}", str(row[col]))
# 替换表格内文字
for tbl in doc.tables:
for cells in tbl.rows:
for cell in cells.cells:
for col in data.columns:
iff"{{{{{col}}}}}"in cell.text:
cell.text = cell.text.replace(f"{{{{{col}}}}}", str(row[col]))
doc.save(f"output/{row['姓名']}.docx")
print("生成完成")
三、占位符规范
建议统一用双花括号 {{列名}},和普通文字区分开,不容易误替换。
模板里写:尊敬的 {{姓名}} 同学:,数据表列名就叫 姓名。
四、常见坑
- • 每次循环重新
Document("模板.docx"),不要复用同一个对象,否则上次替换会残留。 - • 占位符拆成两段({{ 和 姓名 }} 之间换行)会匹配不到,模板里占位符要连着写。
- • 数字金额建议
str(row[col]) 前 round 并格式化,如 f"{row['金额']:.2f}"。 - • 中文乱码:python-docx 写 docx 本身不乱码,注意数据表用
utf-8-sig 读 csv。
五、装依赖
pip install python-docx pandas openpyxl
六、配套工具怎么用
打开 main.py:
- 1. 选模板 .docx(含
{{列名}} 占位符)。 - 4. 批量生成到 output 文件夹,显示进度。
100 份合同,点一下就好。