乐于分享
好东西不私藏

《效率翻倍!Python批量替换Word/Excel文本:正文、页眉、页脚、文本框全覆盖,一处修改处处同步!》

《效率翻倍!Python批量替换Word/Excel文本:正文、页眉、页脚、文本框全覆盖,一处修改处处同步!》

“带你横跨办公自动化的数据江海”

@摸鱼

闻道有先后,术业有专攻。

各位大佬好!

~我依旧是你们的老朋友摸鱼~

♥ 1

在职场摸爬滚打的这十多年里,我用Python悄悄干了不少“正事”——不知不觉攒下了一整套办公自动化的实用项目技巧。去年10月初创立了公众号 「码海听潮」 ,初衷很简单:把重复的劳动交给代码,把摸鱼的时间留给生活。

目前已经吭哧吭哧更新了90多篇原创文章,每一篇都是实操干货,不讲虚的,只聊怎么用代码真正解放双手,帮大家早点下班、准点摸鱼

♥ 2

♥ 3好叻,多了不说,少了不唠,咱直接上干货。

办公需求场景

从崩溃到优雅的进化

有一个神秘的文件夹,里面有多个word和excel文档,现在的需求是同时要把excel表格里的’报告编号‘改为’报表编号‘,word文档里的’项目编号‘改成’工程编号‘,除了正文,页眉、页脚、文本框这样的页面区域也要改过来。要是这种类似的需求你的Big Boss安排你去完成,请问阁下该如何应对?

需求的文件夹word/excel文件列表

  • 需求的Excel如下图:

  • 需求的word文档如下图

办公痛点分析

01

痛点一:重复劳动,耗时且枯燥

    • 假设有50个文档,每个文档需要分别打开、查找、替换、保存、关闭。每个文档还要分别在正文、页眉、页脚、文本框中多次执行查找替换操作。

    02

    痛点二:操作繁琐,步骤易乱

      • 页眉页脚编辑:需要双击进入页眉区域 → 选中文字 → 修改 → 关闭页眉页脚 → 再进入下一页(如果不同节有不同页眉)。复杂文档可能有几十个节,每个节都要单独改。

      • 文本框:需要先找到文本框(可能叠在图片下或被拖动到边角),再选中内部文字修改。

      • Excel多个工作表:一个Excel文件可能有Sheet1、Sheet2、隐藏工作表,需要逐一点击进入修改,页眉页脚也要单独设置。

      由此可见若下载成百上千个office文档的话整个操作流程繁琐且耗时,高频次的鼠标点击和键盘输入使操作者手指疲劳,堪称”键盘敲冒烟”式的体力劳动,加上人工疲劳操作极易导致遗漏文件夹。于是乎这时候,按以往的 “解题套路”,Python 的专属 BGM 该响起来了 ——go~ go~ go~,救苦救难的大救星这不就来了!!

      @摸鱼

      问题拆解思路

      1.循环遍历文件夹,获取word、excel文件列表

      2.对循环到word、excel文档,进行新旧文本替换操作

      3.自动保存修改后的文档到指定文件夹

      下面,我就用python代码让大佬们见识一下,什么叫”传统文化遇上赛博效率”(仅展示部分代码,非完整代码,需完整代码看文章末尾说明~)

      import sysfrom PyQt6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,                             QGroupBox, QPushButton, QLabel, QLineEdit, QTextEdit,                             QFileDialog, QComboBox, QMessageBox, QProgressBar)from PyQt6.QtCore import Qtfrom PyQt6.QtGui import QFontclass MainWindow(QMainWindow):    def __init__(self):        super().__init__()        self.setWindowTitle("Word/Excel批量文本替换工具-欢迎关注微信公众号:码海听潮")        self.setMinimumSize(800730)        self.init_ui()        self.set_style()    def init_ui(self):        main = QWidget()        self.setCentralWidget(main)        layout = QVBoxLayout(main)        layout.setSpacing(16)        layout.setContentsMargins(30303030)        # 类型选择        g1 = QGroupBox("选择类型")        v1 = QVBoxLayout(g1)        self.type_box = QComboBox()        self.type_box.addItems(["Word 文档""Excel 表格""Word文档 + Excel表格"])        self.type_box.setFont(QFont("Microsoft YaHei"10))        v1.addWidget(self.type_box)        layout.addWidget(g1)        # 文件夹        g2 = QGroupBox("源文件夹")        v2 = QVBoxLayout(g2)        h2 = QHBoxLayout()        self.folder_input = QLineEdit()        self.folder_input.setPlaceholderText("选择包含 Word/Excel 的文件夹")        self.folder_btn = QPushButton("浏览")        self.folder_btn.clicked.connect(self.choose_folder)        h2.addWidget(self.folder_input)        h2.addWidget(self.folder_btn)        v2.addLayout(h2)        layout.addWidget(g2)        # 保存文件夹        g3 = QGroupBox("保存到(不选则覆盖原文件)")        v3 = QVBoxLayout(g3)        h3 = QHBoxLayout()        self.save_input = QLineEdit()        self.save_btn = QPushButton("浏览")        self.save_btn.clicked.connect(self.choose_save)        h3.addWidget(self.save_input)        h3.addWidget(self.save_btn)        v3.addLayout(h3)        layout.addWidget(g3)        # 替换模式        g4 = QGroupBox("替换模式")        v4 = QVBoxLayout(g4)        self.mode_box = QComboBox()        self.mode_box.addItems(["部分替换(只改关键词)""整段替换(整段覆盖)"])        v4.addWidget(self.mode_box)        layout.addWidget(g4)        # 替换规则        g5 = QGroupBox("替换规则(每行:旧文本=新文本)")        v5 = QVBoxLayout(g5)        self.rule_edit = QTextEdit()        self.rule_edit.setPlaceholderText("示例:\n测试文本=替换结果\n公司名称=我的公司")        self.rule_edit.setMinimumHeight(120)        v5.addWidget(self.rule_edit)        layout.addWidget(g5)        # 状态栏        self.status_label = QLabel("就绪")        self.status_label.setAlignment(Qt.AlignmentFlag.AlignCenter)        self.status_label.setMinimumHeight(30)        layout.addWidget(self.status_label)        # 进度条        self.progress_bar = QProgressBar()        self.progress_bar.setVisible(False)        self.progress_bar.setMinimumHeight(25)        self.progress_bar.setFormat("%p% (%v/%m)")        layout.addWidget(self.progress_bar)        # 按钮        btn_layout = QHBoxLayout()        self.start_btn = QPushButton("▶ 开始替换")        self.clear_btn = QPushButton("🔧 清理残留进程")        self.start_btn.clicked.connect(self.start)        self.clear_btn.clicked.connect(self.clear_process)        btn_layout.addWidget(self.start_btn)        btn_layout.addWidget(self.clear_btn)        layout.addLayout(btn_layout)    def set_style(self):        self.setStyleSheet("""            QMainWindow {                background-color: #f7f8fa;            }            QGroupBox {                font-size: 11pt;                font-weight: bold;                color: #333;                border: 1px solid #ddd;                border-radius: 10px;                margin-top: 12px;                padding-top: 8px;                background-color: white;            }            QGroupBox::title {                subcontrol-origin: margin;                left: 10px;                padding: 0 8px;                background: white;            }            QLineEdit, QTextEdit, QComboBox {                border: 1px solid #dcdfe6;                border-radius: 8px;                padding: 8px 12px;                font-size: 10pt;                background-color: #ffffff;                selection-background-color: #0078d4;            }            QPushButton {                border: none;                border-radius: 8px;                padding: 10px 18px;                font-size: 10pt;                font-weight: bold;                color: white;                background-color: #0078d4;            }            QPushButton:hover {                background-color: #005fb3;            }            QPushButton:pressed {                background-color: #004a8c;            }            QProgressBar {                border: 1px solid #dcdfe6;                border-radius: 8px;                text-align: center;                background-color: #ffffff;            }            QProgressBar::chunk {                background-color: #0078d4;                border-radius: 7px;            }            QLabel {                color: #606266;                font-size: 10pt;            }        """)    def choose_folder(self):        d = QFileDialog.getExistingDirectory()        if d:            self.folder_input.setText(d)    def choose_save(self):        d = QFileDialog.getExistingDirectory()        if d:            self.save_input.setText(d)    def start(self):        folder = self.folder_input.text().strip()        if not folder:            QMessageBox.warning(self"提示""请选择源文件夹")            return        rules = self.rule_edit.toPlainText().strip().split("\n")        replace_dict = {}        for line in rules:            line = line.strip()            if "=" not in line:                continue            a, b = line.split("="1)            replace_dict[a.strip()] = b.strip()        if not replace_dict:            QMessageBox.warning(self"提示""请输入替换规则")            return        # 界面演示:显示模拟提示        selected_type = self.type_box.currentText()        save = self.save_input.text().strip() or "覆盖原文件"        self.status_label.setText(f"模拟处理:{selected_type} | 保存位置:{save}")        self.progress_bar.setVisible(True)        self.progress_bar.setValue(50)        QMessageBox.information(self"演示模式"                               f"这是纯界面演示版本\n\n"                               f"类型:{selected_type}\n"                               f"源文件夹:{folder}\n"                               f"保存位置:{save}\n"                               f"替换规则:{len(replace_dict)} 条\n\n"                               f"实际处理功能已被移除,仅保留界面。")    def clear_process(self):        self.status_label.setText("已模拟清理残留进程(仅界面演示)")        QMessageBox.information(self"提示""清理残留进程(模拟操作)")if __name__ == "__main__":    app = QApplication(sys.argv)    window = MainWindow()    window.show()    sys.exit(app.exec())

      最终所有的word/excel文档里指定的文本成功替换,实现了之前既定的需求….

      替换后word文档

      替换后的excel文档

      通过上面Python自动化脚本,仅用几分钟的时间就完成原需手动操作数小时甚至数天的工作任务。从最初准备手动人工机械操作的麻木到用python实现高效自动化的畅快,工作效率获得指数级提升,终于实现了不加班熬夜的自由!

      大佬们也可以举一反三,参照上面的代码思路根据自己工作中的实际情况来具体问题具体分析,实现自己定制化的需求。

      结语

      当Python遇见办公,牛马打工人终于笑出了猪叫声

      【职场人必看】每天早上一睁眼,想到又要面对:

      1.📊 堆积如山的Excel表格

      2.📑 机械重复的复制粘贴

      3.✍️ 永远改不完的各类文档

      4.诸如此类的更多……..

      是不是连Ctrl+Alt+Delete的心都有了?

      别慌!别急,摸鱼这位“职场外挂”已经带着Python代码来拯救你了!

      友情提示:考虑到没有python环境的朋友需要打包好的成品exe,摸鱼早已贴心打包好,本篇文章代码打包的exe截图如下:

      另外,《码海听潮》公众号所有文章码和exe程序已打包好上传绿联nas私有云,有需要的大佬扫一扫上面博主的个人微信二维码,需要的大佬需支付9.9元永久拥有公众号资源(写原创干货费时费力,属实不易),邀请您进入社区群获取下载链接!!,群内提供python办公自动化交流问题,解决问题,且码海听潮微信公众号文章发布会第一时间会更新到群里,非诚勿扰哈!

      码海听潮官方社区群如下:

      赶紧微信扫一扫下方二维码添加摸鱼君微信