Python办公自动化实战建议

Python做办公自动化,主要覆盖:Excel/Word/PPT处理、PDF、邮件、文件批量处理、网页数据抓取、自动填表、定时任务。下面分库选型、开发思路、避坑、工程化、落地技巧,全部是实际工作踩坑总结。

一、主流库选型(按场景)

1)Excel(最常用)

  1. openpyxl:读写xlsx,不支持xls;支持单元格样式、合并单元格、公式读写,优先选。适合日常报表、格式保留。
  2. pandas:大数据量表格、数据分析、多表合并、CSV;缺点:对单元格样式、图表支持很差,只关心数据就用pandas。
  3. xlrd+xlwt:老版,xlrd3不再支持xlsx,只用于古老.xls,新项目尽量避开。
  4. win32com( pywin32 ):直接调用本机Excel程序,可以完整执行宏、透视表、图表;只能Windows,需要安装Office。

    建议:普通数据处理 → openpyxl/pandas;要操作宏、图表、打印 → pywin32com。

2)Word

  • python‑docx:读写docx,不能读doc;处理段落、表格、样式;不支持页眉页脚复杂场景。
  • pywin32com:Windows下操作真实Word,完美支持页眉、域、目录、旧doc文件。

3)PPT

  • python‑pptx:读写pptx,修改文本、表格、图片;动画、母版部分功能有限。
  • pywin32com:Windows完整操控PPT。

4)PDF

  • PyPDF2 / pypdf:拆分、合并、旋转PDF,提取文本。
  • pdfplumber:精准提取PDF表格,表格优先用它。
  • reportlab:生成全新PDF。
  • 注意:扫描版图片PDF,以上全部无效,需要OCR:pytesseract + Tesseract‑OCR

5)邮件收发

  • smtplib + email:发送邮件,带附件;
  • imaplib:读取接收邮件;

    企业邮箱很多需要授权码,不能直接用登录密码。

6)文件系统批量自动化

内置模块优先,不用装第三方:
os、pathlib(强烈推荐pathlib,比os更简洁)、shutil批量复制移动重命名。

7)网页/表单自动化

  1. requests + BeautifulSoup:接口、静态网页爬数据。
  2. Selenium / Playwright:模拟浏览器操作,网页填表、导出报表;Playwright更稳定,自动等待,比selenium少写很多等待代码。

8)定时运行

  • Windows:任务计划程序;Linux/macOS:cron
  • Python库:schedule库做简单循环定时;不建议生产环境用schedule替代系统定时,程序崩溃就停止。
⚠️ 跨平台提醒
pywin32com 只能Windows且本机必须安装微软Office;Mac/Linux无法调用,跨平台脚本优先选择 openpyxl/python‑docx/python‑pptx。

二、开发流程建议(非常重要)

1. 先梳理业务流程,不要上来直接写代码

  1. 把人工步骤拆解:输入文件是什么?每一步做什么?输出什么?异常会有哪些?
  2. 区分:哪些是纯数据逻辑,哪些需要Office原生UI/格式/打印。

    如果大量复杂格式、宏、打印,优先考虑 pywin32com;纯数据处理尽量不用com,速度慢、容易卡死。

2. 开发原则

  1. 输入输出分离:原始文件放input,生成结果输出到output,绝不修改原始源文件。
  2. 参数外部化:文件路径、报表名称、邮箱账号不要硬编码,写到配置文件config.ini / json。
  3. 日志!日志!日志,使用python标准库logging。自动化脚本半夜出错,没有日志完全不知道哪里崩了。
  4. 增加异常捕获 try‑except:文件找不到、单元格为空、格式错误要捕获,输出明确错误信息,不要直接崩溃。
  5. 小步迭代:先跑通一个样例文件,再批量处理全部文件。

示例简单日志模板

import logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[logging.FileHandler("run.log",encoding="utf‑8"),logging.StreamHandler()]
)

三、高频踩坑点

  1. com组件(pywin32)坑点

    • 脚本异常退出时Excel/Word进程残留在后台,任务管理器一堆EXCEL.EXE,占用文件锁。
      ✅解决:必须try‑finally保证关闭app、quit,释放COM对象。
    import win32com.client
    excel = None
    try:
     excel = win32com.client.Dispatch("Excel.Application")
     excel.Visible = False
     #业务代码
    finally:
     if excel:
         excel.Quit()
  2. 文件被占用报错:脚本运行时不要手动打开被操作的Excel。
  3. pandas丢失样式:pandas保存会抹掉全部单元格格式,如果需要保留原有格式,不要用pandas写回原文件,改用openpyxl。
  4. PDF扫描件不能提取文字:必须OCR,普通pdf库无效。
  5. 中文乱码:读写csv指定encoding="utf‑8‑sig",Windows办公软件打开不乱码。
  6. 路径不要写死 C:\xxx,用pathlib做跨平台路径,避免反斜杠转义问题。

    from pathlib import Path
    BASE = Path(__file__).parent
    input_dir = BASE / "input"
    output_dir = BASE / "output"
    output_dir.mkdir(exist_ok=True) #不存在自动创建

四、脚本交付给非技术同事使用

同事不会装Python环境,两种方案:

  1. 使用pyinstaller打包exe,把脚本打包成独立可执行程序。

    注意:打包com组件程序体积巨大;尽量把输入输出放到exe同级目录。
    pyinstaller -F -w main.py
  2. -F单文件;‑w运行不弹出黑控制台窗口;调试阶段不要加‑w,看不到报错。
  3. 如果条件允许,部署在服务器,做成简单Web界面:用Gradio / Streamlit,同事打开浏览器就能运行自动化脚本,不用安装任何东西。强烈推荐给业务部门,维护最简单。

五、什么时候不建议用Python做?

  1. 简单少量任务:每月1次,文件极少,写Python的时间比手动还久,不如手动。
  2. 极度复杂Office文档:大量VBA宏、复杂动态图表、域、复杂排版,用VBA更适配。
  3. 高并发多人协同编辑,Python不适合,优先用企业低代码、在线表格。

六、学习路线建议

  1. 基础:掌握pathlib、csv、logging基础工具;
  2. 高频:openpyxl + pandas处理Excel报表,这是办公自动化80%场景;
  3. 进阶:PDF提取表格、自动发邮件;
  4. 高阶:Playwright网页自动化、pywin32com操控Office;
  5. 工程化:配置文件、日志、异常、打包exe/Streamlit网页。

七、简单示例小模板(批量读取excel输出新表)

from pathlib import Path
from openpyxl import load_workbook

base = Path(__file__).parent
wb = load_workbook(base/"input"/"数据.xlsx")
ws = wb.active

for row in ws.iter_rows(min_row=2,values_only=True):
    name,value = row[0],row[1]
    print(name,value)

wb.save(base/"output"/"结果.xlsx")
wb.close()