当前位置:首页>python>《办公党福音!别再手动另存为了!Python一键批量将Word/Excel/PPT转PDF,效率暴涨!》

《办公党福音!别再手动另存为了!Python一键批量将Word/Excel/PPT转PDF,效率暴涨!》

  • 2026-09-09 17:21:43
《办公党福音!别再手动另存为了!Python一键批量将Word/Excel/PPT转PDF,效率暴涨!》

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

@摸鱼

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

各位大佬好!

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

♥ 1

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

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

♥ 2

♥ 3

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

办公需求场景

从崩溃到优雅的进化

有一个神秘的文件夹,里面有多个word、excel、ppt办公文档,现在的需求是批量把所有这些文档按原名转为pdf文档,要是这种类似的需求你的Big Boss安排你去完成,请问阁下该如何应对?

需求的文件列表如下图:

办公痛点分析

01

痛点一:耗时耗力、机械重复

    •  假设有100个文件,就需要重复100次“双击打开 -> 等待加载 -> 点击文件菜单 -> 点击导出/另存为 -> 选择PDF格式 -> 选择保存位置 -> 点击保存 -> 关闭文件”这个流程。

    02

    痛点二:极易出错和遗漏

      • 忘记改名/覆盖原文件: 在批量操作时,很容易手快点了保存,结果把原文档覆盖了,或者忘记改名导致文件混乱。

      • 漏转文件: 在几十个文件夹里翻找,很难保证百分百覆盖所有子文件夹中的文件,经常会有“漏网之鱼”。

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

      @摸鱼

      问题拆解思路

      1.遍历办公文档文件夹→

      2.自动识别办公文档格式,保存对应的pdf文档。

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

      import sysfrom PyQt6.QtWidgets import (    QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout,    QPushButton, QLabel, QLineEdit, QFileDialog, QCheckBox,    QTextEdit, QGroupBox, QGridLayout)from PyQt6.QtCore import Qtfrom PyQt6.QtGui import QFont, QTextCursorclass ModernButton(QPushButton):    def __init__(self, text, parent=None, primary=False):        super().__init__(text, parent)        self.primary = primary        self.setMinimumHeight(40)        self.setCursor(Qt.CursorShape.PointingHandCursor)        # 设置字体        font = QFont()        font.setPointSize(11)        self.setFont(font)        if primary:            self.setStyleSheet("""                QPushButton {                    background-color: #2196F3;                    color: white;                    border: none;                    border-radius: 6px;                    padding: 10px 20px;                    font-weight: bold;                }                QPushButton:hover {                    background-color: #1976D2;                }                QPushButton:pressed {                    background-color: #0D47A1;                }                QPushButton:disabled {                    background-color: #BDBDBD;                }            """)        else:            self.setStyleSheet("""                QPushButton {                    background-color: #f5f5f5;                    color: #333333;                    border: 1px solid #ddd;                    border-radius: 6px;                    padding: 10px 20px;                }                QPushButton:hover {                    background-color: #e0e0e0;                }                QPushButton:pressed {                    background-color: #bdbdbd;                }                QPushButton:disabled {                    background-color: #f5f5f5;                    color: #999;                }            """)class ModernLineEdit(QLineEdit):    """现代风格的输入框"""    def __init__(self, placeholder="", parent=None):        super().__init__(parent)        self.setPlaceholderText(placeholder)        self.setMinimumHeight(40)        self.setStyleSheet("""            QLineEdit {                border: 2px solid #e0e0e0;                border-radius: 6px;                padding: 8px 12px;                background-color: white;                font-size: 11pt;            }            QLineEdit:focus {                border: 2px solid #2196F3;            }            QLineEdit:disabled {                background-color: #f5f5f5;            }        """)class FormatCheckBox(QCheckBox):    """格式复选框"""    def __init__(self, text, format_list, parent=None):        super().__init__(text, parent)        self.format_list = format_list        self.setMinimumHeight(30)        self.setStyleSheet("""            QCheckBox {                font-size: 11pt;                spacing: 8px;            }            QCheckBox::indicator {                width: 20px;                height: 20px;            }            QCheckBox::indicator:unchecked {                border: 2px solid #bdbdbd;                border-radius: 4px;                background-color: white;            }            QCheckBox::indicator:checked {                border: 2px solid #2196F3;                border-radius: 4px;                background-color: #2196F3;            }            QCheckBox::indicator:hover {                border: 2px solid #1976D2;            }        """)class MainWindow(QMainWindow):    """主窗口"""    def __init__(self):        super().__init__()        self.init_ui()    def init_ui(self):        """初始化UI"""        self.setWindowTitle("Office 文档批量转 PDF")        self.setMinimumSize(800, 650)        # 设置应用样式        self.setStyleSheet("""            QMainWindow {                background-color: #fafafa;            }            QGroupBox {                font-weight: bold;                border: 2px solid #e0e0e0;                border-radius: 8px;                margin-top: 15px;                padding-top: 12px;                font-size: 12pt;                background-color: white;            }            QGroupBox::title {                subcontrol-origin: margin;                left: 15px;                padding: 0 8px 0 8px;                color: #1976D2;            }            QLabel {                color: #333;                font-size: 11pt;            }            QTextEdit {                border: 2px solid #e0e0e0;                border-radius: 8px;                background-color: white;                font-family: 'Consolas', 'Monaco', monospace;                font-size: 11pt;                padding: 8px;            }        """)        # 创建中央部件        central_widget = QWidget()        self.setCentralWidget(central_widget)        # 主布局        main_layout = QVBoxLayout(central_widget)        main_layout.setSpacing(20)        main_layout.setContentsMargins(30, 30, 30, 30)        # 目录选择区域        dir_group = QGroupBox("📁 目录选择")        dir_layout = QGridLayout(dir_group)        dir_layout.setVerticalSpacing(15)        dir_layout.setHorizontalSpacing(10)        # 输入目录        dir_layout.addWidget(QLabel("输入目录:"), 0, 0)        self.input_path = ModernLineEdit("选择包含Office文件的文件夹")        dir_layout.addWidget(self.input_path, 0, 1)        self.input_btn = ModernButton("浏览...")        self.input_btn.clicked.connect(self.select_input_dir)        dir_layout.addWidget(self.input_btn, 0, 2)        # 输出目录        dir_layout.addWidget(QLabel("输出目录:"), 1, 0)        self.output_path = ModernLineEdit("选择PDF输出文件夹(默认使用输入目录)")        dir_layout.addWidget(self.output_path, 1, 1)        self.output_btn = ModernButton("浏览...")        self.output_btn.clicked.connect(self.select_output_dir)        dir_layout.addWidget(self.output_btn, 1, 2)        main_layout.addWidget(dir_group)        # 格式选择区域        format_group = QGroupBox("📋 选择要转换的Office格式")        format_layout = QHBoxLayout(format_group)        format_layout.setSpacing(40)        format_layout.setContentsMargins(20, 20, 20, 20)        # 格式复选框 - 水平排列        self.word_cb = FormatCheckBox("📝 Word 文档", ['.doc', '.docx'])        self.word_cb.setChecked(False)        format_layout.addWidget(self.word_cb)        self.excel_cb = FormatCheckBox("📊 Excel 表格", ['.xls', '.xlsx'])        self.excel_cb.setChecked(False)        format_layout.addWidget(self.excel_cb)        self.ppt_cb = FormatCheckBox("📽️ PowerPoint 演示", ['.ppt', '.pptx'])        self.ppt_cb.setChecked(False)        format_layout.addWidget(self.ppt_cb)        format_layout.addStretch()        main_layout.addWidget(format_group)        # 日志区域        log_group = QGroupBox("📊 转换日志")        log_layout = QVBoxLayout(log_group)        log_layout.setSpacing(15)        # 日志显示        self.log_text = QTextEdit()        self.log_text.setReadOnly(True)        self.log_text.setMinimumHeight(150)        log_layout.addWidget(self.log_text)        main_layout.addWidget(log_group)        # 按钮区域        button_layout = QHBoxLayout()        self.start_btn = ModernButton("🚀 开始转换", primary=True)        self.start_btn.setMinimumWidth(180)        button_layout.addWidget(self.start_btn)        self.stop_btn = ModernButton("⏹️ 停止转换")        self.stop_btn.setEnabled(False)        self.stop_btn.setMinimumWidth(150)        button_layout.addWidget(self.stop_btn)        self.clear_btn = ModernButton("🗑️ 清空日志")        self.clear_btn.clicked.connect(self.clear_log)        self.clear_btn.setMinimumWidth(130)        button_layout.addWidget(self.clear_btn)        # 设置居中对齐        button_layout.setAlignment(Qt.AlignmentFlag.AlignCenter)        main_layout.addLayout(button_layout)    def select_input_dir(self):        """选择输入目录"""        dir_path = QFileDialog.getExistingDirectory(            self, "选择输入目录", self.input_path.text()        )        if dir_path:            self.input_path.setText(dir_path)            # 如果输出目录为空,自动填充为输入目录            if not self.output_path.text():                self.output_path.setText(dir_path)    def select_output_dir(self):        """选择输出目录"""        dir_path = QFileDialog.getExistingDirectory(            self, "选择输出目录", self.output_path.text() or self.input_path.text()        )        if dir_path:            self.output_path.setText(dir_path)    def clear_log(self):        """清空日志"""        self.log_text.clear()def main():    """主函数"""    app = QApplication(sys.argv)    # 设置应用样式    app.setStyle('Fusion')    # 创建并显示主窗口    window = MainWindow()    window.show()    sys.exit(app.exec())if __name__ == "__main__":    main()

      最终将所有word\excel\ppt办公文档转为了pdf文档,实现了之前既定的需求....

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

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

      结语

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

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

      1.📊 堆积如山的Excel表格

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

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

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

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

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

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

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

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

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

      可直接点击下载:
      office文档批量转pdf.rar

      最新文章

      随机文章