用 Python 写了个小工具:让 Excel 数据自动填充 Word 模板

张开发
2026/4/8 15:24:37 15 分钟阅读

分享文章

用 Python 写了个小工具:让 Excel 数据自动填充 Word 模板
用 Python 写了个小工具让 Excel 数据自动填充 Word 模板最近被重复性的文档填写工作搞烦了。每次要给客户发合同、证书、通知书之类的文件内容差不多就是名字、日期、金额不一样。手改吧10份以内还能忍100份就开始心态爆炸了。所以写了个小工具专门干这件事Excel 数据 Word 模板 一键批量生成 Word 文档。痛点场景你有没有遇到过这种情况100 份录取通知书就名字不一样50 份合同金额、日期不同节日给客户发批量邮件附件要是个性化 PDF手改改到怀疑人生复制粘贴改名字改到吐。我之前也是这么干的。直到某天忍无可忍决定写个工具解放自己。解决方案思路很简单Excel 放数据每行一条记录Word 模板里用{{字段名}}占位程序自动替换生成 N 个文件Word 模板示例您好{{姓名}} 您的订单 {{订单号}} 已确认 将于 {{日期}} 送达 {{地址}}。Excel 表头对应姓名订单号日期地址张三A0012026-04-01北京市朝阳区运行之后自动生成张三.docx内容里所有{{姓名}}都替换成张三。核心代码用到的库就两个openpyxl读 Excelpython-docx操作 Word。占位符替换逻辑defreplace_placeholders(doc,data_dict):替换 Word 里的 {{字段名}}replaced_count0# 段落 表格都要处理forparagraphindoc.paragraphs:forruninparagraph.runs:if{{inrun.textand}}inrun.text:forkey,valueindata_dict.items():placeholder{{key}}ifplaceholderinrun.text:run.textrun.text.replace(placeholder,str(value))replaced_count1# 表格里的占位符也要替换fortableindoc.tables:forrowintable.rows:forcellinrow.cells:forparagraphincell.paragraphs:forruninparagraph.runs:if{{inrun.textand}}inrun.text:forkey,valueindata_dict.items():placeholder{{key}}ifplaceholderinrun.text:run.textrun.text.replace(placeholder,str(value))replaced_count1returnreplaced_count批量生成forrow_numinrange(2,ws.max_row1):# 读取 Excel 行数据dataread_excel_row(ws,row_num)# 加载模板new_docDocument(template_path)# 替换占位符replace_placeholders(new_doc,data)# 生成文件名优先用姓名/标题filenamegenerate_filename(data,row_num)# 保存new_doc.save(os.path.join(output_folder,filename))使用方式命令行python excel-to-word-template.py data.xlsx template.docx output/交互模式不加参数直接运行会弹出文件选择对话框python excel-to-word-template.py这个功能依赖 tkinter如果没装会降级成手动输入路径。算是兜底方案吧。踩过的坑坑1日期格式乱了Excel 里的日期类型直接读出来是个数字比如45456。处理方式是判断是否有strftime方法有就转换ifhasattr(value,strftime):valuevalue.strftime(%Y-%m-%d)坑2文件名冲突如果两条数据姓名一样后面的会覆盖前面的。加了个自动编号ifos.path.exists(output_path):name,extos.path.splitext(filename)counter1whileos.path.exists(output_path):output_pathos.path.join(output_folder,f{name}_{counter}{ext})counter1坑3字段名对不上模板里写了{{姓名}}Excel 表头是{{用户名称}}结果生成的文件全是占位符。所以加了匹配检查matched_fields[fforfintemplate_fieldsiffinheaders]print(f✅ 字段匹配:{len(matched_fields)}/{len(template_fields)})不匹配会警告但不会中断执行——毕竟有些模板字段可能就是用来放空的。效果展示处理 100 份文件大概 3-5 秒主要看 Word 模板复不复杂。 开始生成 Word 文件... ✅ [1/100] 张三.docx ✅ [2/100] 李四.docx ✅ [3/100] 王五.docx ... 完成成功生成 100 个 Word 文件 输出目录: output写在最后这个小工具没什么高大上的技术就是解决实际问题。如果你也被重复性文档工作困扰不妨试试。代码开源在 GitHub拿去随便用。项目地址https://github.com/Remy0328/excel-to-word-generator依赖pipinstallopenpyxl python-docx有改进建议欢迎评论区交流。

更多文章