我的知识记录

Python Word批量生成通知书邀请函教程

用python-docx基于模板批量生成录取通知书、邀请函、奖状、感谢信等公文,从Excel读取收件人信息,一键生成几十份个性化文档。

场景痛点

学校、公司、协会要发一批录取通知书、会议邀请函、活动通知,模板固定,但每个人的姓名、学号、部门、参会时间都不一样。手动复制模板改名字,几十份文档改几十遍,还容易写错名字。用Python做批量生成,把人员名单存在Excel里,一键生成所有通知书,每份带姓名、头衔、专属编号,效率提升百倍。

用到的库

pip install python-docx openpyxl

完整代码

# 导入库
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
import openpyxl
import os

def set_run_font(run, font_name='宋体', size=14, bold=False, color=(0, 0, 0)):
"""设置run字体"""
run.font.name = font_name
run._element.rPr.rFonts.set(qn('w:eastAsia'), font_name)
run.font.size = Pt(size)
run.bold = bold
run.font.color.rgb = RGBColor(*color)

def generate_one_notice(template_path, output_path, data):
"""根据模板和单条数据生成一份通知书"""
doc = Document(template_path)

# 遍历所有段落替换占位符
for para in doc.paragraphs:
full_text = ''.join(run.text for run in para.runs)
new_text = full_text
for key, value in data.items():
placeholder = '{' + key + '}'
if placeholder in new_text:
new_text = new_text.replace(placeholder, str(value))
if new_text != full_text and para.runs:
para.runs[0].text = new_text
for run in para.runs[1:]:
run.text = ''

# 替换表格里的占位符
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
for para in cell.paragraphs:
full_text = ''.join(run.text for run in para.runs)
new_text = full_text
for key, value in data.items():
placeholder = '{' + key + '}'
if placeholder in new_text:
new_text = new_text.replace(placeholder, str(value))
if new_text != full_text and para.runs:
para.runs[0].text = new_text
for run in para.runs[1:]:
run.text = ''

doc.save(output_path)

def batch_generate(excel_path, template_path, output_dir):
"""批量读取Excel并生成所有通知书"""
os.makedirs(output_dir, exist_ok=True)

# 读取Excel人员名单
wb = openpyxl.load_workbook(excel_path)
ws = wb.active
headers = [cell.value for cell in ws[1]]

count = 0
for row in ws.iter_rows(min_row=2, values_only=True):
data = dict(zip(headers, row))
if not data.get('姓名'):
continue

# 文件名用姓名+编号
notice_id = data.get('编号', '')
name = data['姓名']
filename = f'通知书_{notice_id}_{name}.docx'
output_path = os.path.join(output_dir, filename)

generate_one_notice(template_path, output_path, data)
count += 1
print(f'已生成:{filename}')

print(f'\n全部完成,共生成 {count} 份通知书')

if __name__ == '__main__':
batch_generate(
excel_path='人员名单.xlsx',
template_path='通知书模板.docx',
output_dir='./生成通知书'
)

代码讲解

  • 模板里用{姓名}{学号}{部门}这种单大括号做占位符,和合同模板的双大括号区分开,避免混淆。
  • Excel第一行表头就是占位符名称,比如表头"姓名"对应模板里的{姓名},自动匹配。
  • 批量生成时遍历Excel每一行,每行生成一份文档,文件名用编号+姓名自动命名,方便后续打印分发。
  • 替换逻辑和合同模板一致:拼接run文本→替换→写回第一个run,解决跨run问题。
  • 模板本身要设计好排版:大标题居中、正文宋体二号、落款右对齐,Python只负责填内容不负责排版。

运行结果

运行脚本后,./生成通知书文件夹里每个学生生成一份独立的通知书docx,文件名格式如通知书_2026001_张三.docx。打开任意一份,姓名、学号、专业、入学时间等信息都已填入对应位置,格式和模板完全一致。

注意事项

  • 模板占位符不要拆格式写,保持纯文字,否则替换后格式会变。
  • Excel里空行要跳过,否则会生成一份空白通知书。
  • 通知书类文档一般要打印,建议模板里先设好A4纸、页边距、行距,生成后直接打印不用再调。
  • 编号如果要自动生成,可以用Python的str(i).zfill(6)补零,不用从Excel读。

Python Word批量生成通知书邀请函教程

标签:

更新时间:2026-09-15 08:52:55

上一篇:Python Word生成员工简历批量版:从Excel批量出简历

下一篇:Python Word批量提取所有表格汇总到Excel