在日常办公中,Excel 的重复操作(如合并几十个部门报表、统一重命名工作表、批量提取数据)是典型的“低效劳动”。手动处理不仅慢,而且容易出错。本文基于 Python 的 os、xlwings 和 pandas 三库分工协作,提供一套可复用的批量处理模板,并重点讲解路径管理、临时文件过滤、资源释放和结果验证等踩坑经验。
一、三大库的分工:各自负责什么
os:负责文件系统层面的批处理,如遍历目录、拼接路径、判断扩展名、创建输出文件夹。
- import os
- folder = r"C:\Temp\excel_batch"
- for file_name in os.listdir(folder):
- if file_name.endswith(".xlsx"):
- full_path = os.path.join(folder, file_name)
- print(full_path)
复制代码
xlwings:模拟人工操作 Excel 应用程序,适合处理需要公式刷新、宏、打印、打开工作簿等场景。需注意本机必须安装 Excel。
- import xlwings as xw
- app = xw.App(visible=False)
- wb = app.books.open(r"C:\Temp\excel_batch\demo.xlsx")
- sheet = wb.sheets[0]
- sheet.range("A1").value = "Python 批量处理测试"
- wb.save()
- wb.close()
- app.quit()
复制代码
pandas:直接处理表格数据,读取、筛选、分组、合并、导出等。不依赖 Excel 程序,速度和稳定性更优。
- import pandas as pd
- df = pd.read_excel(r"C:\Temp\excel_batch\sales.xlsx")
- result = df.groupby("产品", as_index=False)["销售额"].sum()
- result.to_excel(r"C:\Temp\excel_batch\销售额汇总.xlsx", index=False)
复制代码
二、批处理通用模板(pathlib + pandas)
无论任务是批量新建、合并还是重命名,外层流程固定:确定输入/输出目录 → 遍历文件 → 过滤目标 → 逐个处理 → 保存输出 → 关闭资源。下面是用 pathlib 和 pandas 实现的安全模板:
- from pathlib import Path
- import pandas as pd
- input_dir = Path(r"C:\Temp\excel_batch\input")
- output_dir = Path(r"C:\Temp\excel_batch\output")
- output_dir.mkdir(exist_ok=True)
- for file_path in input_dir.glob("*.xlsx"):
- if file_path.name.startswith("~$"):
- continue
- print(f"正在处理:{file_path.name}")
- df = pd.read_excel(file_path)
- # 示例处理逻辑:删除完全空白行
- df = df.dropna(how="all")
- output_path = output_dir / f"{file_path.stem}_处理后.xlsx"
- df.to_excel(output_path, index=False)
- print("批量处理完成")
复制代码
关键点:
- 使用 pathlib 管理路径,避免反斜杠转义问题。
- 跳过以 ~$ 开头的临时文件(Excel 打开时生成)。
- 先输出到新目录,不要直接覆盖原文件。
三、运行前必须做的四件事(排雷指南)
1. 统一目录结构:建议分为 input、output、backup 三个文件夹。先复制 3-5 个样本测试,再对整个文件夹执行。
2. 先备份:涉及改名、删除、覆盖等破坏性操作时,一定先复制原始文件到 backup。避免不可逆损失。
3. 关闭占用:Excel 文件被打开时脚本可能写入失败。若使用 xlwings,务必在 finally 中关闭工作簿并退出应用,防止后台残留进程。
4. 验证结果,不能只看“运行完成”:写一段脚本检查输出文件数量和基本字段。
- from pathlib import Path
- output_dir = Path(r"C:\Temp\excel_batch\output")
- files = list(output_dir.glob("*.xlsx"))
- print(f"输出文件数量:{len(files)}")
- for file in files[:5]:
- print(file.name)
复制代码
四、常见踩坑点与防御写法
1. 中文路径和反斜杠:使用原始字符串 r"..." 或 pathlib.Path,避免转义。
2. 临时文件~$:遍历时用 startswith("~$") 跳过。
3. 字段名不一致:不同部门提交的 Excel 可能有“资产编号”和“资产编码”等差异。在做汇总前先校验必需字段:
- required_columns = {"资产编号", "资产名称", "使用部门"}
- missing = required_columns - set(df.columns)
- if missing:
- print(f"字段缺失:{missing}")
复制代码
4. xlwings 资源释放:用 try...finally 确保 wb.close() 和 app.quit() 执行。
- import xlwings as xw
- app = xw.App(visible=False)
- try:
- wb = app.books.open(r"C:\Temp\excel_batch\demo.xlsx")
- # 处理逻辑
- wb.save()
- wb.close()
- finally:
- app.quit()
复制代码
五、可复盘的脚本:加入日志与计数
一段真正可用的办公自动化脚本应记录处理了多少文件、跳过多少、失败多少及原因。下面模板适合后续扩展成工具:
- from pathlib import Path
- import pandas as pd
- input_dir = Path(r"C:\Temp\excel_batch\input")
- output_dir = Path(r"C:\Temp\excel_batch\output")
- output_dir.mkdir(exist_ok=True)
- success_count = 0
- fail_count = 0
- for file_path in input_dir.glob("*.xlsx"):
- if file_path.name.startswith("~$"):
- continue
- try:
- df = pd.read_excel(file_path)
- df = df.dropna(how="all")
- output_path = output_dir / f"{file_path.stem}_处理后.xlsx"
- df.to_excel(output_path, index=False)
- print(f"[成功] {file_path.name} -> {output_path.name}")
- success_count += 1
- except Exception as e:
- print(f"[失败] {file_path.name},原因:{e}")
- fail_count += 1
- print(f"处理完成:成功 {success_count} 个,失败 {fail_count} 个")
复制代码
六、总结:自动化思维比代码更重要
Python 处理 Excel 的真正价值不在于记住某个 API,而在于把重复动作抽象成稳定流程。先识别重复任务,拆分为“文件层 → Excel层 → 数据层”,再选用合适的库实现。每次写脚本前备份、先小样本测试、加入输入校验和结果验证,才能让自动化真正可靠。积累可复用的遍历、读取、输出、日志模板,后续遇到新需求只需拼装改造,无需从零开始。 |