导言

工作需要开发了一个实用的办公自动化工具——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中创建模板文件,使用 <<字段名>> 作为占位符。

  1. 打开Word,创建新文档
  2. 输入以下内容(注意占位符格式):
澄清公告

关于《<<项目名称>>》(项目编号:<<项目编号>>)的澄清公告

各潜在投标人:

现对招标文件中的以下内容进行澄清:

原招标文件内容:
<<原招标文件内容>>

修改后内容:
<<修改后内容>>

公告发布单位:<<公告发布单位>>
特此公告。

招标代理机构:xxx公司
地址:<<地址>>
联系人:<<联系人>>
电话:<<电话>>
时间:<<时间>>
  1. 保存为 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界面效果

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')

字段名匹配规则

  • 模板中:<<项目名称>>
  • 代码中:项目名称(不需要 <<>>
  • 必须完全匹配,区分大小写

🚀 高级功能扩展

  1. 批量生成:从Excel读取数据,循环生成多个文档
  2. 数据验证:生成前检查必填字段
  3. 模板管理:支持多个模板切换
  4. 历史记录:保存生成历史,支持重新编辑

🎁 完整项目下载

项目结构
GitCodeBatchGenWord

blog_steps/
├── templates/
│   └── tmp_clarification_notice.docx
├── result/                              # 生成的文档存放目录
├── demo_01_simple.py                    # 命令行版本
├── demo_01_gui.py                       # GUI版本(推荐)
└── requirements.txt                     # 依赖包列表

一键运行

  1. 安装依赖:pip install -r requirements.txt
  2. 准备模板:在 templates 目录下放置模板文件
  3. 运行代码:python demo_01_gui.py

总结

这个工具5分钟上手,效率提升10倍
从此告别手动复制粘贴,再也不用担心:

  • ✅ 文档格式不统一
  • ✅ 批量生成效率低
  • ✅ 容易出错漏填

模板+数据=批量文档,Python让办公更智能!

下期预告

  • 第二期:Excel表格插入Word文档(使用COM接口)
  • 第三期:页码更新与目录自动生成

欢迎点赞收藏转发你的一个赞就是对我开发热情的最大支持! 👏

有问题留言区咨询,我看到必回!


系列文章目录

  • ✅ 第一期:Word文档文字插入(本文)
  • 🔜 第二期:Excel表格插入Word文档
  • 🔜 第三期:页码更新与目录生成
  • 🔜 第四期:本地存储记忆功能
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐