我的知识记录

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_csvopenpyxl 写模式优化。
  • 输出文件名不要和输入文件名重名,否则会读到自己刚生成的文件。

Python合并多个Excel表格到一张表

标签:

更新时间:2026-09-15 09:02:43

上一篇:Python openpyxl 插入Excel柱状图步骤详解

下一篇:Python Excel写入公式并读取计算结果方法详解