Python自动化办公:Word文档批量生成神器(第一期)
·
Python自动化办公:Word文档批量生成神器(第一期)
导言
工作需要开发了一个实用的办公自动化工具——Word文档批量生成系统
核心功能:通过Python自动填充Word模板,一键生成格式规范的公告文件等办公文档,告别手动复制粘贴!(内容较多,将分期逐次分享)
适用场景:
- 批量生成通知公告
- 企业批量生成格式统一的合同文件
- 任何需要批量生成格式文档的场景
一句话总结:模板+数据=批量文档,5分钟搞定一天的工作!
技术实现原理
🎯 核心技术栈
| 技术 | 作用 |
|---|---|
| Python + docx-mailmerge2 | Word文档文字插入 |
| PySimpleGUI | 图形界面(可选) |
| Word邮件合并域 | 模板占位符 |
📋 完整工作流程
准备Word模板(含占位符) → Python读取模板 → 填充数据 → 生成新文档 → 保存到result目录
关键点:
- Word模板中使用
<<字段名>>作为占位符 - Python通过
MailMerge库替换占位符 - 支持中文字段名,完美适配国内办公场景
完整代码实现
1. 基础版本:命令行生成器 demo_01_simple.py
核心功能:最简单的文字插入实现,适合快速上手和批量处理。
# -*- coding: utf-8 -*-
"""
澄清公告生成器 - 简化版
使用前请确保:
1. 已安装 docx-mailmerge2: pip install docx-mailmerge2
2. 在 templates 目录下创建 tmp_clarification_notice.docx 模板文件
"""
import os
from mailmerge import MailMerge
from datetime import datetime
def simple_generate():
"""简单版本,直接生成文档"""
# 模板文件路径
template_path = './templates/tmp_clarification_notice.docx'
# 检查模板文件是否存在
if not os.path.exists(template_path):
print(f'\n❌ 错误:模板文件 {template_path} 不存在!\n')
return
# 创建输出目录
output_dir = 'result'
if not os.path.exists(output_dir):
os.mkdir(output_dir)
print(f'✅ 已创建输出目录:{output_dir}')
# 准备数据(示例数据)
data = {
'项目名称': '测试项目A',
'项目编号': 'ZB2024001',
'原招标文件内容': '原文件要求投标人具有相关资质,注册资金不少于500万元。',
'修改后内容': '修改后要求投标人具有相关资质,且注册资金不少于1000万元,同时需要提供近三年的业绩证明。',
'公告发布单位': 'xxx招标代理有限公司',
'地址': '北京市朝阳区xxx路xxx号',
'联系人': '张三',
'电话': '010-12345678',
'时间': datetime.now().strftime('%Y年%m月%d日')
}
try:
print('\n开始生成文档...')
print(f'📄 模板文件:{template_path}')
# 打开模板
doc = MailMerge(template_path)
print('✅ 模板文件加载成功')
# 合并数据(关键步骤)
print('🔄 正在合并数据...')
doc.merge(**data)
# 保存文件
output_path = os.path.join(output_dir, f'澄清公告{datetime.now().strftime("%Y年%m月%d日")}.docx')
doc.write(output_path)
print(f'\n✅ 文档生成成功!')
print(f'📁 保存位置:{os.path.abspath(output_path)}')
except Exception as e:
print(f'\n❌ 生成文档时出错:{str(e)}')
print('\n请检查:')
print('1. 模板文件是否存在')
print('2. 模板中的字段名是否正确(格式:<<字段名>>)')
print('3. 代码中的字段名是否与模板一致')
if __name__ == '__main__':
simple_generate()
代码解析:
MailMerge(template_path):打开Word模板doc.merge(**data):核心方法,将字典数据填充到模板占位符doc.write(output_path):保存生成的新文档
2. 进阶版本:GUI图形界面 demo_01_gui.py
核心功能:带图形界面的版本,操作更友好,适合日常使用。
# -*- coding: utf-8 -*-
"""
澄清公告生成器 - GUI版本(带界面)
使用前请确保:
1. 已安装依赖: pip install docx-mailmerge2 PySimpleGUI
2. 在 templates 目录下创建 tmp_clarification_notice.docx 模板文件
"""
from datetime import datetime
import os
from mailmerge import MailMerge
import PySimpleGUI as sg
def generate_clarification_notice():
"""生成澄清公告 - GUI版本"""
work_dir = os.path.dirname(__file__)
template_dir = os.path.join(work_dir, 'templates')
result_dir = os.path.join(work_dir, 'result')
os.chdir(work_dir)
# 创建必要的目录
if not os.path.exists(template_dir):
os.mkdir(template_dir)
if not os.path.exists(result_dir):
os.mkdir(result_dir)
# 设置主题
sg.theme('LightGrey1')
# 定义配色方案
primary_color = '#4A90E2' # 柔和的蓝色
secondary_color = '#5CB85C' # 清新的绿色
danger_color = '#E74C3C' # 柔和的红色
# 创建GUI布局
layout = [
[sg.Text('📄 澄清公告生成器', font=('微软雅黑', 20, 'bold'),
text_color=primary_color, justification='center', expand_x=True)],
[sg.HorizontalSeparator(color=primary_color)],
# 基本信息区域
[sg.Frame('📋 基本信息', [
[sg.Text('项目名称:', size=(15, 1)),
sg.InputText(key='name', expand_x=True)],
[sg.Text('项目编号:', size=(15, 1)),
sg.InputText(key='no', expand_x=True)],
[sg.Text('公告发布单位:', size=(15, 1)),
sg.InputText(key='company', expand_x=True)],
], font=('微软雅黑', 11, 'bold'), title_color=primary_color, expand_x=True)],
# 内容区域
[sg.Frame('📝 澄清内容', [
[sg.Text('原招标文件内容:')],
[sg.Multiline(key='remark_old', size=(None, 5), expand_x=True, expand_y=True)],
[sg.Text('修改后内容:')],
[sg.Multiline(key='remark_new', size=(None, 5), expand_x=True, expand_y=True)],
], font=('微软雅黑', 11, 'bold'), title_color=primary_color, expand_x=True, expand_y=True)],
# 联系信息区域
[sg.Frame('📞 联系信息', [
[sg.Text('地址:', size=(15, 1)),
sg.InputText(key='addr', expand_x=True)],
[sg.Text('联系人:', size=(15, 1)),
sg.InputText(key='contacts', expand_x=True)],
[sg.Text('电话:', size=(15, 1)),
sg.InputText(key='tel', expand_x=True)],
[sg.Text('时间:', size=(15, 1)),
sg.InputText(key='dt', default_text=datetime.now().strftime('%Y年%m月%d日'), expand_x=True)],
], font=('微软雅黑', 11, 'bold'), title_color=primary_color, expand_x=True)],
[sg.HorizontalSeparator(color=primary_color)],
# 按钮区域
[sg.Push(),
sg.Button('🔄 清空', size=(12, 2), button_color=('white', '#95A5A6')),
sg.Button('✅ 生成文档', size=(15, 2), button_color=('white', secondary_color), key='生成文档'),
sg.Button('❌ 退出', size=(12, 2), button_color=('white', danger_color)),
sg.Push()],
]
# 创建窗口
window = sg.Window('澄清公告生成器', layout,
resizable=True, size=(800, 920), finalize=True)
while True:
event, values = window.read()
if event in (None, '退出', sg.WIN_CLOSED):
break
elif event == '清空':
# 清空所有输入框
for key in ['name', 'no', 'remark_old', 'remark_new',
'company', 'addr', 'contacts', 'tel', 'dt']:
window[key].update('')
window['dt'].update(datetime.now().strftime('%Y年%m月%d日'))
elif event == '生成文档':
# 检查必填字段
if not values['name'] or not values['no']:
sg.popup_error('请填写项目名称和项目编号!')
continue
try:
template_path = './templates/tmp_clarification_notice.docx'
if not os.path.exists(template_path):
sg.popup_error(f'模板文件不存在:{template_path}')
continue
# 显示进度提示
sg.popup_animated(sg.DEFAULT_BASE64_LOADING_GIF, '正在生成文档...')
# 打开模板并合并数据
doc = MailMerge(template_path)
doc.merge(
项目名称=values['name'],
项目编号=values['no'],
原招标文件内容=values['remark_old'],
修改后内容=values['remark_new'],
公告发布单位=values['company'],
地址=values['addr'],
联系人=values['contacts'],
电话=values['tel'],
时间=values['dt']
)
# 保存文件
output_filename = f"{values['name']}_澄清公告{datetime.now().strftime('%Y年%m月%d日')}.docx"
output_path = os.path.join(result_dir, output_filename)
doc.write(output_path)
sg.popup_animated(None)
sg.popup_ok(f'✅ 文档生成成功!\n📁 {os.path.abspath(output_path)}')
except Exception as e:
sg.popup_animated(None)
sg.popup_error(f'生成文档时出错:\n{str(e)}')
window.close()
if __name__ == '__main__':
generate_clarification_notice()
GUI版本优势:
- ✅ 可视化操作,无需写代码
- ✅ 实时输入验证
- ✅ 进度提示,用户体验好
- ✅ 支持窗口大小调整
🚀 一键部署教程
步骤1:环境准备
# 创建项目目录
mkdir WordDocGenerator
cd WordDocGenerator
# 创建虚拟环境(推荐)
python -m venv .venv
.venv\Scripts\activate # Windows
# source .venv/bin/activate # Linux/Mac
# 安装依赖
pip install docx-mailmerge2 PySimpleGUI
pip freeze > requirements.txt
requirements.txt:
docx-mailmerge2==0.6.2
PySimpleGUI==4.60.4
步骤2:创建Word模板
关键步骤:在Word中创建模板文件,使用 <<字段名>> 作为占位符。
- 打开Word,创建新文档
- 输入以下内容(注意占位符格式):
澄清公告
关于《<<项目名称>>》(项目编号:<<项目编号>>)的澄清公告
各潜在投标人:
现对招标文件中的以下内容进行澄清:
原招标文件内容:
<<原招标文件内容>>
修改后内容:
<<修改后内容>>
公告发布单位:<<公告发布单位>>
特此公告。
招标代理机构:xxx公司
地址:<<地址>>
联系人:<<联系人>>
电话:<<电话>>
时间:<<时间>>
- 保存为
tmp_clarification_notice.docx,放在templates目录下
重要提示:
- ✅ 占位符格式必须是
<<字段名>>(两个尖括号) - ✅ 字段名可以是中文
- ✅ 字段名必须与代码中的字典key完全一致
步骤3:文件部署
目录结构:
WordDocGenerator/
├── templates/
│ └── tmp_clarification_notice.docx # Word模板文件
├── result/ # 输出目录(自动创建)
├── demo_01_simple.py # 命令行版本
├── demo_01_gui.py # GUI版本
└── requirements.txt # 依赖包
步骤4:运行测试
方式一:命令行版本
python demo_01_simple.py
方式二:GUI版本(推荐)
python demo_01_gui.py
运行效果:
- 命令行版本:直接生成文档,输出保存路径
- GUI版本:弹出图形界面,填写表单后点击"生成文档"
📸 实际效果展示
生成前(模板)
模板文件中的占位符:
项目名称:<<项目名称>>
项目编号:<<项目编号>>
生成后(结果)
生成的文档中占位符被替换:
项目名称:测试项目A
项目编号:ZB2024001
文件命名规则:
{项目名称}_澄清公告{日期}.docx
示例:测试项目A_澄清公告2025年12月21日.docx
GUI界面效果:

⚠️ 注意事项与优化
✅ 常见问题解决
| 问题 | 解决方案 |
|---|---|
| 新版PySimpleGUI需要收费 | 可以安装PySimpleGUI==4.60.5版本 |
| 占位符没有被替换 | 检查占位符格式:必须是 <<字段名>>,不能有空格 |
| 字段名不匹配 | 确保代码中的字段名与模板中的完全一致(区分大小写) |
| 模板文件找不到 | 检查路径:./templates/tmp_clarification_notice.docx |
| 安装库失败 | 使用国内镜像:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docx-mailmerge2 |
🔧 核心代码解析
MailMerge核心用法:
from mailmerge import MailMerge
# 1. 打开模板
doc = MailMerge('template.docx')
# 2. 合并数据(关键步骤)
doc.merge(
项目名称='测试项目A',
项目编号='ZB2024001',
# ... 更多字段
)
# 3. 保存文件
doc.write('output.docx')
字段名匹配规则:
- 模板中:
<<项目名称>> - 代码中:
项目名称(不需要<<和>>) - 必须完全匹配,区分大小写
🚀 高级功能扩展
- 批量生成:从Excel读取数据,循环生成多个文档
- 数据验证:生成前检查必填字段
- 模板管理:支持多个模板切换
- 历史记录:保存生成历史,支持重新编辑
🎁 完整项目下载
项目结构:
GitCode:BatchGenWord
blog_steps/
├── templates/
│ └── tmp_clarification_notice.docx
├── result/ # 生成的文档存放目录
├── demo_01_simple.py # 命令行版本
├── demo_01_gui.py # GUI版本(推荐)
└── requirements.txt # 依赖包列表
一键运行:
- 安装依赖:
pip install -r requirements.txt - 准备模板:在
templates目录下放置模板文件 - 运行代码:
python demo_01_gui.py
总结
这个工具5分钟上手,效率提升10倍!
从此告别手动复制粘贴,再也不用担心:
- ✅ 文档格式不统一
- ✅ 批量生成效率低
- ✅ 容易出错漏填
模板+数据=批量文档,Python让办公更智能!
下期预告:
- 第二期:Excel表格插入Word文档(使用COM接口)
- 第三期:页码更新与目录自动生成
欢迎点赞收藏转发,你的一个赞就是对我开发热情的最大支持! 👏
有问题留言区咨询,我看到必回!
系列文章目录:
- ✅ 第一期:Word文档文字插入(本文)
- 🔜 第二期:Excel表格插入Word文档
- 🔜 第三期:页码更新与目录生成
- 🔜 第四期:本地存储记忆功能
更多推荐

所有评论(0)