Python Excel从多个工作簿汇总到一张总表
遍历文件夹下所有Excel工作簿,读取每个文件的指定工作表,自动按列名对齐汇总成一张总表,支持子目录递归、跳过临时文件。
场景痛点
财务每个月一个Excel,12个月放在12个文件里;或者各地分公司每月各交一份表。要把它们汇总到一张总表做分析,手工打开复制粘贴,时间长了根本受不了。脚本写一次,以后每月一键汇总。
用到的库
pip install pandas openpyxl
完整代码
import os
import pandas as pd
def summarize_workbooks(input_dir, output_file, sheet_name=0, recursive=False):
"""
汇总目录下所有xlsx到一张总表
input_dir: 存放各分表的文件夹
output_file: 输出总表
sheet_name: 读取哪个sheet
recursive: 是否递归子目录
"""
# 收集文件
xlsx_files = []
if recursive:
for root, dirs, files in os.walk(input_dir):
for f in files:
if f.endswith(".xlsx") and not f.startswith("~"):
xlsx_files.append(os.path.join(root, f))
else:
for f in os.listdir(input_dir):
if f.endswith(".xlsx") and not f.startswith("~"):
xlsx_files.append(os.path.join(input_dir, f))
print(f"共找到{len(xlsx_files)}个文件")
df_list = []
for path in xlsx_files:
try:
df = pd.read_excel(path, sheet_name=sheet_name)
if df.empty:
continue
# 记录文件名和相对路径作为来源
df["来源文件"] = os.path.basename(path)
df_list.append(df)
print(f" 读取: {os.path.basename(path)},{len(df)}行")
except Exception as e:
print(f" 失败: {path},{e}")
if not df_list:
print("没有可汇总的数据")
return
result = pd.concat(df_list, axis=0, ignore_index=True, sort=False)
result.to_excel(output_file, index=False)
print(f"\n汇总完成,共{len(result)}行 -> {output_file}")
if __name__ == "__main__":
summarize_workbooks(
input_dir="./分公司报表",
output_file="./年度汇总总表.xlsx",
sheet_name="月度明细",
recursive=False
)
代码讲解
- 非递归用
os.listdir,递归用os.walk,按需求切换。 - 排除
~开头的文件,那是Excel打开时的临时锁文件。 - 每个文件加"来源文件"列,汇总后还能知道每行来自哪个分公司/哪个月。
pd.concat(..., sort=False)列名按首次出现顺序保留,不会被自动重排。- 单个文件失败 try/except 跳过,不会因为一个坏文件中断整个流程。
运行结果
生成 年度汇总总表.xlsx,所有分表纵向拼在一起,最后一列"来源文件"标记来源,控制台打印每个文件读取行数。
注意事项
- 各分表列名必须一致,否则会出现大量空列;建议先读一个样本看列名。
- 如果各表sheet名不一样,用
sheet_name=0读第一个sheet,或者先pd.ExcelFile看sheet名。 - 几十万行汇总后内存占用高,及时
del df_list释放。

更新时间:2026-09-15 09:03:07