Python 自动化:批量处理 Excel 表格的小脚本实战

月初要做区域销售汇总,下级医院报上来的表格五花八门:有的是 .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 的读、写、遍历,就能应付办公室里八成以上的表格自动化需求。

自动化不是炫技,是给自己省时间。省下来的时间,去做真正需要人的判断和温度的事情。