Python批量处理Excel报表应以pandas处理数据、openpyxl控制样式、os/pathlib遍历文件为核心,配合异常防护与轻量调度,明确分工可高效完成90%自动化任务。

用Python批量处理Excel报表,关键不在写多少行代码,而在选对工具、理清流程、避开常见坑。核心是用pandas读写数据 + openpyxl操作样式/多表/公式,再配合os或pathlib遍历文件——三者配合,90%的日常报表自动化都能稳稳拿下。
统一读取:用pandas接管所有“数据内容”
pandas的read_excel()能自动识别.xlsx/.xls,支持指定sheet、跳过行、列名处理;写入时to_excel()配合ExcelWriter可追加多表。别用手动循环xlrd或openpyxl逐单元格读——慢、易错、难维护。
- 读多个文件合并:用
glob或pathlib.Path().glob("*.xlsx")收集路径,pd.concat([pd.read_excel(f) for f in files]) - 读特定区域:加
usecols="A:C"或skiprows=2, nrows=100,比手动切片更可靠 - 写入不覆盖原格式:先用
openpyxl.load_workbook()打开模板,再用pd.ExcelWriter(... engine="openpyxl", if_sheet_exists="replace")
精准控制:用openpyxl处理“非数据”需求
字体、边框、合并单元格、条件格式、图表、密码保护……这些pandas干不了,必须交给openpyxl。原则是:pandas管“算什么”,openpyxl管“怎么呈现”。
- 给标题行加粗居中:
ws['A1'].font = Font(bold=True); ws['A1'].alignment = Alignment(horizontal="center") - 动态冻结首行首列:
ws.freeze_panes = "B2" - 写入后自动调整列宽:
for col in ws.columns: max_length = max(len(str(cell.value)) for cell in col); ws.column_dimensions[col[0].column_letter].width = min(max_length + 2, 50)
安全执行:文件遍历+异常防护不能少
批量处理最怕中途报错导致部分文件写坏或漏处理。加基础防护,脚本就从“偶尔能跑”变成“每天敢用”。
立即学习“Python免费学习笔记(深入)”;
- 跳过临时文件:
if file.name.startswith("~$") or file.suffix.lower() not in [".xlsx", ".xls"]:continue - 用
try...except包裹单文件处理,记录错误日志(如print(f"❌ {file} 处理失败:{e}")),不中断整体流程 - 输出前备份原文件:
shutil.copy(file, file.with_suffix(".xlsx.bak")),改出问题可秒回退
轻量调度:不用上Airflow,几行代码也能定时跑
日报/周报类任务,不需要复杂调度系统。Windows用任务计划程序绑定.bat,macOS/Linux用crontab,脚本内只需保证可独立执行:
- 入口加
if __name__ == "__main__": main(),方便命令行直接运行 - 路径用
Path(__file__).parent / "data"而非硬编码"C:/xxx",迁移不改代码 - 加简单参数支持:
python report.py --mode daily --output ./output_20240520.xlsx,用argparse解析即可
基本上就这些。不复杂,但容易忽略细节——比如忘了关闭ExcelWriter导致文件被占用,或没设dtype=str让电话号码变科学计数。动手前先明确:我要改的是数据逻辑?还是页面效果?还是执行节奏?对应找pandas、openpyxl、os/pathlib,各司其职,事半功倍。










