Python合并多个Excel表格到一张表
用pandas批量读取文件夹下所有xlsx文件,自动按列名对齐合并成一张总表,附带表头对齐、跳过空文件、保留来源列等实战技巧,几分钟搞定人工几小时的合并工作。
场景痛点
每个部门每周交一份周报,文件名各不相同,列名大致一致但顺序常有差异。手工打开复制粘贴,几十份表格点到手酸,还容易漏行、错列。用Python+pandas写一次脚本,以后丢进文件夹一键合并,秒出结果。
用到的库
pip install pandas openpyxl
完整代码
import os
import pandas as pd
def merge_excel_files(input_dir, output_file, sheet_name=0, add_source=True):
"""
合并文件夹下所有 .xlsx 文件到一张表
input_dir: 存放Excel的文件夹
output_file: 输出合并后的文件路径
sheet_name: 读取哪个工作表,0表示第一个
add_source: 是否新增一列标记数据来源文件
"""
# 收集所有xlsx文件
files = [f for f in os.listdir(input_dir) if f.endswith(".xlsx") and not f.startswith("~")]
if not files:
print("目录下没有找到xlsx文件")
return
df_list = []
for file in files:
path = os.path.join(input_dir, file)
try:
df = pd.read_excel(path, sheet_name=sheet_name)
# 跳过空表
if df.empty:
print(f"跳过空文件: {file}")
continue
if add_source:
df["来源文件"] = file
df_list.append(df)
print(f"读取成功: {file},{len(df)}行")
except Exception as e:
print(f"读取失败: {file},原因: {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"合并完成,共{len(result)}行,已保存到: {output_file}")
if __name__ == "__main__":
merge_excel_files(
input_dir="./待合并",
output_file="./合并结果.xlsx"
)
代码讲解
os.listdir扫描目录,过滤.xlsx后缀,并用not f.startswith("~")排除Excel打开时产生的临时锁文件。- 逐个
pd.read_excel读取,try/except 保证单个文件损坏不影响整体。 pd.concat(df_list, axis=0, ignore_index=True)纵向堆叠;sort=False防止列顺序被自动重排。add_source=True时新增"来源文件"列,合并后还能追溯每行来自哪个原表。
运行结果
运行后在当前目录生成 合并结果.xlsx,所有表格行数据纵向拼在一起,列自动按列名对齐,多出的列用空值填充。控制台打印每个文件的读取行数和最终总行数。
注意事项
- 所有文件建议用相同列名,否则会出现大量空列;列名有空格或全半角差异会被当成不同列,先用
str.strip()统一。 - 数据量超过10万行时,
to_excel偏慢,可改用to_csv或openpyxl写模式优化。 - 输出文件名不要和输入文件名重名,否则会读到自己刚生成的文件。

更新时间:2026-09-15 09:02:43
上一篇:Python openpyxl 插入Excel柱状图步骤详解