在日常办公、行政人事、法务合同、企业文案处理工作中,你一定被这些场景折磨到崩溃: 几十份合同需要替换甲方名称、签订日期、金额等关键信息,手动复制粘贴一小时起步,还容易漏改、改错;上百份文档格式混乱,字体、字号、行距、段落对齐方式五花八门,逐份调整格式耗时又费力;需要根据固定模板批量生成入职通知、报价单、授权书,手动创建文档效率低到离谱……
这些重复、机械、枯燥的Word操作,不仅占用大量工作时间,还极易出现人为失误,一旦出错返工成本极高。作为办公人,我们最需要的就是一款零代码操作、界面简洁、功能齐全、一键运行的批量处理工具,不用懂编程,点开就能用,点一下就能完成几十上百份文档的处理。
今天就给大家带来一款基于Python+PyQt5开发的Word批量处理工具,集文字批量替换、合同模板批量生成、文档格式统一修改三大核心功能于一体,界面美观大方,操作简单易懂,Windows/Mac全平台通用,完全免费开源!工具无需安装Office/WPS,依赖轻量库即可运行,新手也能轻松上手,彻底解放双手,让你把时间花在更有价值的工作上!
工具核心亮点: ✅ 可视化GUI界面,鼠标点选即可操作,无任何学习成本 ✅ 三大核心功能全覆盖,满足90%以上Word批量处理需求 ✅ 支持docx格式文档,处理速度快,批量处理百份文档秒级完成 ✅ 代码完整开源,可根据自身需求二次修改拓展 ✅ 无需依赖Office软件,轻量无卡顿,兼容性强
接下来,我将详细拆解工具的开发代码,从界面搭建、核心功能实现到完整代码展示,手把手带你拥有专属办公神器!
一、核心代码模块详细讲解
模块1:PyQt5界面搭建(主窗口+功能分区)
这是工具的可视化界面核心,我们采用PyQt5设计主窗口,划分三大功能区域:文字替换区、合同生成区、格式修改区,搭配文件选择按钮、输入框、运行按钮,让操作逻辑一目了然。界面使用网格布局,美观规整,适配不同分辨率屏幕,同时添加提示文本、状态提示栏,提升使用体验。
核心逻辑:创建主窗口类,初始化所有控件(按钮、输入框、标签、文本框),设置布局和样式,绑定按钮点击事件,实现文件/文件夹选择、功能触发的交互效果。
模块2:Word核心处理功能实现(python-docx库)
这是工具的业务核心,使用python-docx库实现Word文档的读写、文字替换、段落修改、格式设置,不依赖Office组件,纯Python代码处理文档。
- 文字替换:遍历文档所有段落、表格,精准匹配关键词并替换;
- 合同生成:读取模板文档,批量替换占位符(如{{公司名}}、{{日期}}),另存为新文档;
- 格式修改:统一设置全文字体(宋体/微软雅黑)、字号、行距、段落对齐方式,批量规范化格式。
模块3:功能逻辑绑定与异常处理
将界面按钮与核心处理函数绑定,添加异常捕获机制:处理文件不存在、文档格式错误、占位符缺失等问题,在界面状态栏实时提示处理结果(成功/失败/处理数量),让用户清晰掌握运行状态,避免程序崩溃。
二、完整工具代码
# 导入所需库import sysimport osfrom docx import Documentfrom docx.shared import Pt, Cmfrom docx.oxml.ns import qnfrom docx.enum.text import WD_ALIGN_PARAGRAPHfrom PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QLabel, QLineEdit, QTextEdit, QPushButton, QFileDialog, QGridLayout, QMessageBox, QStatusBar)from PyQt5.QtCore import Qt# 主工具类classWordBatchTool(QMainWindow):def__init__(self): super().__init__() self.setWindowTitle("Word批量处理工具 | 文字替换+合同生成+格式修改") self.setFixedSize(750, 550) # 固定窗口大小 self.init_ui() # 初始化界面# 初始化界面控件definit_ui(self):# 中央控件 central_widget = QWidget() self.setCentralWidget(central_widget) layout = QGridLayout(central_widget)# ==================== 功能1:批量文字替换 ==================== layout.addWidget(QLabel("【功能1:批量文字替换】"), 0, 0, 1, 2) layout.addWidget(QLabel("选择Word文件夹:"), 1, 0) self.replace_folder = QLineEdit() layout.addWidget(self.replace_folder, 1, 1) self.btn_replace_folder = QPushButton("选择文件夹") self.btn_replace_folder.clicked.connect(self.select_replace_folder) layout.addWidget(self.btn_replace_folder, 1, 2) layout.addWidget(QLabel("查找文字:"), 2, 0) self.find_text = QLineEdit() layout.addWidget(self.find_text, 2, 1, 1, 2) layout.addWidget(QLabel("替换为:"), 3, 0) self.replace_text = QLineEdit() layout.addWidget(self.replace_text, 3, 1, 1, 2) self.btn_run_replace = QPushButton("开始批量替换文字") self.btn_run_replace.clicked.connect(self.batch_replace_text) layout.addWidget(self.btn_run_replace, 4, 0, 1, 3)# ==================== 功能2:合同批量生成 ==================== layout.addWidget(QLabel("【功能2:合同模板批量生成】"), 5, 0, 1, 2) layout.addWidget(QLabel("选择合同模板:"), 6, 0) self.template_path = QLineEdit() layout.addWidget(self.template_path, 6, 1) self.btn_template = QPushButton("选择模板") self.btn_template.clicked.connect(self.select_template) layout.addWidget(self.btn_template, 6, 2) layout.addWidget(QLabel("占位符替换规则(格式:key=value,一行一个):"), 7, 0, 1, 3) self.replace_rules = QTextEdit() self.replace_rules.setPlaceholderText("示例:\n{{公司}}=测试公司\n{{日期}}=2025-01-01\n{{金额}}=10000元") layout.addWidget(self.replace_rules, 8, 0, 1, 3) layout.addWidget(QLabel("生成保存文件夹:"), 9, 0) self.save_folder = QLineEdit() layout.addWidget(self.save_folder, 9, 1) self.btn_save_folder = QPushButton("选择文件夹") self.btn_save_folder.clicked.connect(self.select_save_folder) layout.addWidget(self.btn_save_folder, 9, 2) self.btn_run_create = QPushButton("开始批量生成合同") self.btn_run_create.clicked.connect(self.batch_create_contract) layout.addWidget(self.btn_run_create, 10, 0, 1, 3)# ==================== 功能3:批量修改格式 ==================== layout.addWidget(QLabel("【功能3:Word批量统一格式】"), 11, 0, 1, 2) layout.addWidget(QLabel("选择格式修改文件夹:"), 12, 0) self.format_folder = QLineEdit() layout.addWidget(self.format_folder, 12, 1) self.btn_format_folder = QPushButton("选择文件夹") self.btn_format_folder.clicked.connect(self.select_format_folder) layout.addWidget(self.btn_format_folder, 12, 2) self.btn_run_format = QPushButton("开始统一文档格式") self.btn_run_format.clicked.connect(self.batch_change_format) layout.addWidget(self.btn_run_format, 13, 0, 1, 3)# 状态栏 self.status_bar = QStatusBar() self.setStatusBar(self.status_bar)# ———————— 文件夹/文件选择函数 ————————defselect_replace_folder(self): path = QFileDialog.getExistingDirectory()if path: self.replace_folder.setText(path)defselect_template(self): path, _ = QFileDialog.getOpenFileName(filter="Word文件 (*.docx)")if path: self.template_path.setText(path)defselect_save_folder(self): path = QFileDialog.getExistingDirectory()if path: self.save_folder.setText(path)defselect_format_folder(self): path = QFileDialog.getExistingDirectory()if path: self.format_folder.setText(path)# ———————— 核心功能1:批量文字替换 ————————defbatch_replace_text(self): folder = self.replace_folder.text() find = self.find_text.text() replace = self.replace_text.text()ifnot all([folder, find, replace]): QMessageBox.warning(self, "提示", "请填写完整信息!")return count = 0for file in os.listdir(folder):if file.endswith(".docx"): doc = Document(os.path.join(folder, file))# 替换段落文字for p in doc.paragraphs:if find in p.text: p.text = p.text.replace(find, replace)# 替换表格文字for table in doc.tables:for row in table.rows:for cell in row.cells:if find in cell.text: cell.text = cell.text.replace(find, replace) doc.save(os.path.join(folder, file)) count += 1 self.status_bar.showMessage(f"成功处理 {count} 份文档!")# ———————— 核心功能2:批量生成合同 ————————defbatch_create_contract(self): template = self.template_path.text() save_path = self.save_folder.text() rules = self.replace_rules.toPlainText()ifnot all([template, save_path, rules]): QMessageBox.warning(self, "提示", "请填写完整信息!")return# 解析替换规则 replace_dict = {}for line in rules.split("\n"):if"="in line: k, v = line.split("=", 1) replace_dict[k.strip()] = v.strip()# 读取模板 doc = Document(template)# 替换内容for p in doc.paragraphs:for k, v in replace_dict.items():if k in p.text: p.text = p.text.replace(k, v)for table in doc.tables:for row in table.rows:for cell in row.cells:for k, v in replace_dict.items():if k in cell.text: cell.text = cell.text.replace(k, v)# 保存文件 save_name = f"生成合同_{os.path.basename(template)}" doc.save(os.path.join(save_path, save_name)) self.status_bar.showMessage("合同生成完成!")# ———————— 核心功能3:批量统一格式 ————————defbatch_change_format(self): folder = self.format_folder.text()ifnot folder: QMessageBox.warning(self, "提示", "请选择文件夹!")return count = 0for file in os.listdir(folder):if file.endswith(".docx"): doc = Document(os.path.join(folder, file))# 统一设置字体、字号、行距for p in doc.paragraphs: p.alignment = WD_ALIGN_PARAGRAPH.LEFT # 左对齐 p.paragraph_format.line_spacing = 1.5# 1.5倍行距 p.paragraph_format.first_line_indent = Cm(0.74) # 首行缩进for run in p.runs: run.font.name = "微软雅黑" run._element.rPr.rFonts.set(qn("w:eastAsia"), "微软雅黑") run.font.size = Pt(12) # 字号12 doc.save(os.path.join(folder, file)) count += 1 self.status_bar.showMessage(f"成功统一 {count} 份文档格式!")# 运行程序if __name__ == "__main__": app = QApplication(sys.argv) window = WordBatchTool() window.show() sys.exit(app.exec_())
运行前准备
安装依赖库,复制以下命令在终端执行:
pip install pyqt5 python-docx
三、知识点总结
- 主窗口
QMainWindow、基础控件QLabel/QLineEdit/QPushButton的使用; - 按钮绑定点击事件、文件/文件夹选择、状态栏提示、消息弹窗功能。
- 模板化生成文档:固定模板+变量替换,高效批量产出;
- 批量化处理:遍历文件夹+统一操作,替代手动重复工作。
四、拓展场景与测试步骤
一、拓展使用场景
- 人事行政:批量生成入职通知书、离职证明、考勤通知,统一所有通知格式;
- 法务/销售:批量生成报价单、合同、授权书,一键替换客户信息、金额、日期;
- 教师/办公人员:批量修改作业、报告、文案的字体格式,批量替换敏感文字;
- 企业文员:批量处理归档文档,统一文档规范,提升文档管理效率;
- 二次拓展:可添加批量合并Word、批量转PDF、水印添加、页眉页脚修改等功能。
二、工具测试步骤
- 环境准备:安装Python3.8+,执行
pip install pyqt5 python-docx安装依赖; - 运行代码:将代码保存为
.py文件,双击运行或终端执行python 文件名.py; - 功能1测试:选择包含docx文档的文件夹,输入查找/替换文字,点击运行,查看文档是否替换成功;
- 功能2测试:准备带占位符(如{{公司}})的合同模板,填写替换规则,选择保存路径,生成新合同;
- 功能3测试:选择格式混乱的文件夹,点击统一格式,检查文档字体、行距、缩进是否统一;
- 异常测试:不填写信息直接运行,验证弹窗提示是否正常;选择非docx文件,验证程序是否报错。
总结
这款Word批量处理工具,用Python+PyQt5完美解决了办公中最繁琐的重复工作,三大核心功能覆盖日常文档处理的核心需求,代码简洁易懂、界面友好易用,无论是零基础用户还是有编程基础的开发者,都能快速使用和二次修改。
它不仅是一款办公工具,更是Python办公自动化的最佳实践案例,掌握这些知识点,你还能打造出Excel批量处理、PDF工具、邮件群发等更多办公神器,彻底实现自动化办公!