月初要做区域销售汇总,下级医院报上来的表格五花八门:有的是 .xlsx,有的是 .xls;有的第一行是标题,有的第一行就是数据;列顺序还不一样。以前这事得人工折腾一下午,这次我花十分钟写了个脚本,两分钟跑完。
这就是今天要分享的实战:用 Python 批量合并 Excel 表格。需要的库只有一个:openpyxl。
安装与准备
pip install openpyxl
把要合并的表格放进同一个文件夹,比如 data/,脚本就放在文件夹外面。
核心代码
import glob
from openpyxl import load_workbook, Workbook
HEADER_ROW = 1 # 表头在第 1 行
MIN_COLS = 5 # 少于 5 列视为空文件,跳过
def read_sheet(path):
wb = load_workbook(path, read_only=True)
ws = wb.active
rows = []
for i, row in enumerate(ws.iter_rows(values_only=True), 1):
# 跳过标题行与空行
if i == HEADER_ROW:
continue
if row is None or len([c for c in row if c is not None]) < MIN_COLS:
continue
rows.append(row)
wb.close()
return rows
def main():
out = Workbook()
out_ws = out.active
out_ws.append(["来源文件", "客户", "产品", "数量", "金额"]) # 统一表头
for path in glob.glob("data/*.xls*"):
try:
for row in read_sheet(path):
out_ws.append([path] + list(row))
except Exception as e:
print(f"跳过 {path}: {e}")
out.save("汇总结果.xlsx")
print("完成,共写入", out_ws.max_row - 1, "条记录")
if __name__ == "__main__":
main()
代码思路
glob.glob("data/*.xls*"):同时匹配 .xlsx 和 .xls 文件。read_only=True:以只读模式加载,大文件也不占内存。- 跳过标题行、跳过空行,把"来源文件"列加在最前面,方便追溯每行数据从哪张表来。
- 单张表出错只跳过该表,不影响整体执行。
进阶:顺手做点清洗
真实场景里往往还需要顺带清洗数据,比如金额统一成数字、去掉多余空格、日期转成标准格式。以"金额"为例:
def clean_amount(v):
"""把 '¥1,234.50'、'1234.5元' 这类文本转成数字"""
if v is None:
return 0
if isinstance(v, (int, float)):
return float(v)
s = str(v).replace("¥", "").replace("元", "").replace(",", "")
try:
return float(s)
except ValueError:
return 0
把清洗函数加进循环里,跑出来的结果直接就能用来做统计,比手动改快得多。
小结
这类"一次性但反复出现"的重复劳动,正是 Python 最擅长解决的。不用学得多深,掌握 openpyxl 的读、写、遍历,就能应付办公室里八成以上的表格自动化需求。
自动化不是炫技,是给自己省时间。省下来的时间,去做真正需要人的判断和温度的事情。