Python 批量处理 Excel 实战(openpyxl + pandas)
面向每天和表格打交道的运营、财务、跨境电商从业者,用 Python 自动完成多表合并、清洗、公式填充、图表输出与定时跑批,把重复的表格操作压缩成一条命令。

学习信息
Python 批量处理 Excel 实战
适合谁
- 每天要从后台导出十几张表,手工复制粘贴到一张总表的人
- 做跨境生意,需要把平台订单表清洗成统一格式再发给仓库的人
- 每月要做营收、投放、库存三类报表,流程固定但耗时两小时以上的人
如果你只是想快速处理一次表格,用 Excel 自带功能就够了。真正值得上 Python 的信号是:这件事你每个月、每周甚至每天都会重复做一遍。
两个库怎么选
| 场景 | 推荐 | 理由 | | --- | --- | --- | | 读取 / 聚合 / 计算几十万行 | pandas | 一行代码完成分组统计,速度快 | | 保留原有样式、合并单元格、批注 | openpyxl | pandas 会丢样式,openpyxl 精确到单元格 | | 生成带边框配色的正式报表 | openpyxl | 可以单独控制字体、填充、列宽 | | 只是做数据中间处理,输出新文件 | pandas | 写完 to_excel 一步到位 |
一句话记法:pandas 管数据,openpyxl 管排版。实际项目里经常两个一起用。
实战一:把文件夹里所有订单表合成一张
导出目录里躺着三十多个平台的订单文件,格式相同,逐个打开复制是最浪费时间的做法。
import pandas as pd
from pathlib import Path
SRC = Path("./orders")
# 只取 xlsx,跳过 Excel 打开的临时文件(~$ 开头)
files = [f for f in SRC.glob("*.xlsx") if not f.name.startswith("~$")]
frames = []
for f in files:
df = pd.read_excel(f, dtype={"订单号": str}) # 订单号强制转字符串,防止科学计数法
df["来源文件"] = f.name
frames.append(df)
merged = pd.concat(frames, ignore_index=True)
merged.to_excel("订单汇总.xlsx", index=False)
print(f"合并完成:{len(files)} 个文件,共 {len(merged)} 行")三个新手必踩的坑,这里一次性避开:
1. 订单号变成科学计数法 —— 读表时用 dtype={"订单号": str} 锁死类型 2. Excel 临时文件混进来 —— 过滤 ~$ 前缀文件 3. 合并后行数对不上 —— 用 ignore_index=True,否则索引重复会导致后续筛选错乱
实战二:清洗脏数据
平台导出的表通常带着空行、重复单号、金额带货币符号。
df = pd.read_excel("订单汇总.xlsx", dtype={"订单号": str})
# 1. 去掉全空行
df = df.dropna(how="all")
# 2. 同一订单号只保留最后一条更新记录
df = df.drop_duplicates(subset=["订单号"], keep="last")
# 3. 金额字段可能含 ¥、逗号,先转字符串清洗再转数值
df["金额"] = (
df["金额"].astype(str)
.str.replace(r"[¥¥,$ ]", "", regex=True)
.astype(float)
)
# 4. 日期字段统一格式
df["下单时间"] = pd.to_datetime(df["下单时间"], errors="coerce")
# 5. 剔除金额为负或缺失的关键记录
df = df[df["金额"].notna() & (df["金额"] > 0)]
print(df.describe())errors="coerce" 是关键:遇到解析不了的日期不会报错中断,而是转成 NaT,之后再统一过滤。
实战三:用 openpyxl 生成能直接发出去的报表
pandas 输出的表没有美观可言。要交给老板或客户的报表,用 openpyxl 收拾一遍。
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment
from openpyxl.utils import get_column_letter
wb = load_workbook("订单汇总.xlsx")
ws = wb.active
header_fill = PatternFill("solid", fgColor="4F46E5")
header_font = Font(color="FFFFFF", bold=True)
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
cell.alignment = Alignment(horizontal="center", vertical="center")
# 按内容宽度自适应列宽
for col in ws.columns:
letter = get_column_letter(col[0].column)
width = max((len(str(c.value)) for c in col if c.value), default=10)
ws.column_dimensions[letter].width = min(width + 4, 40)
# 冻结首行,滚动时表头不跑
ws.freeze_panes = "A2"
wb.save("月度订单报表.xlsx")每周自动跑一次的写法
脚本稳定之后,就不需要手动点了。
- macOS / Linux:
crontab -e加一行0 9 * * 1 /usr/bin/python3 /path/to/report.py - Windows:任务计划程序里建基本任务,触发器选每周一,操作指向
pythonw.exe(用pythonw不会有黑窗口闪一下)
跑批脚本建议加三步保险:
1. 先把上次的产出重命名备份,再写新文件 2. 关键步骤用 logging 落日志,别只用 print 3. 异常时用 try / except 包住并把错误写进日志,方便第二天查
常见问题
装 pandas 时报错或很慢? 用国内源:pip install pandas openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple。
中文写进 Excel 乱码? pandas / openpyxl 本身 UTF-8 没问题,乱码通常是源文件编码问题。读取 CSV 时显式指定 encoding="utf-8-sig"(处理带 BOM 的表很有效)。
文件被占用报错 PermissionError? 说明这张表正开着。Excel 打开文件时会上锁,脚本跑之前先关掉。
下一步
- 想把图表也自动化:看 matplotlib 或直接用 Excel 原生图表(openpyxl 支持
BarChart) - 数据量上到百万行:换 polars 或先落 SQLite 再做聚合
- 想做成同事也能用的工具:套一层 Streamlit,十行代码就是个网页小工具
常见问题
下载链接失效怎么办?
请优先切换其他网盘渠道,并反馈失效链接。
会员能下载所有资料吗?
页面标注为会员专享的资料支持会员下载,具体以当前页面显示为准。
相关资源
pandas 数据分析实战:从读表到出结论
用一条完整的分析链路串起 pandas 核心能力——数据读取与类型修整、缺失值与异常值处理、分组聚合、表连接、时间序列重采样,最后用透视表回答真实业务问题。
Excel / CSV 报表自动化 Skill
描述清楚想要的报表,自动生成可执行脚本并完成合并、清洗、透视、格式化全流程,输出带样式的 Excel 或走邮件/磁盘归档,支持一次写成长期定时运行。
MCP Server 开发实战:从零构建标准化工具服务
手把手教你开发 MCP Server,实现 tools/list、tools/call、resources/list、resources/read、prompts/list、prompts/get 完整协议,支持 stdio 和 SSE 传输,包含测试、部署、发布最佳实践。
Python 零基础入门教程(2025 完整版)
面向零基础学员的 Python 编程入门教程,覆盖环境搭建、基础语法、流程控制、函数、模块、面向对象、常用库(requests/numpy/pandas),附带 50+ 实战小项目和面试题。
评论建议
欢迎反馈资料质量、链接状态或希望补充的内容,管理员会持续维护。