python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python合并多文件夹下Excel

Python实现一键合并多文件夹下百份Excel自动汇总至总表

作者:小庄-Python办公

本文介绍了一个使用Python自动合并多文件夹下Excel文件的解决方案,通过30行代码即可实现递归遍历目录、读取Excel数据并合并为总表的功能,大幅提升办公效率,希望对大家有所帮助

场景引入

每月底,财务部门的同事小张总会遇到这样的噩梦:公司下属 12 个分公司各自把报表放在不同的文件夹里,每个文件夹又有 5-10 份 Excel 文件,格式基本一致但文件名五花八门。小张需要手动打开每一份文件,复制粘贴到汇总表里——每次都要花掉整整半天时间。

学完本节,你可以用 不到 30 行 Python 代码,一键遍历所有文件夹、读取所有 Excel 文件,自动合并成一张总表,全程只需 3 秒钟。

技术原理

核心思路分三步:

  1. 遍历目录树:使用 Python 内置的 os.walk()pathlib 递归扫描所有子文件夹
  2. 读取 Excel 文件:使用 pandas.read_excel() 将每个 Excel 文件读取为 DataFrame
  3. 纵向拼接:使用 pandas.concat() 将多个 DataFrame 按行合并,最后导出为新的 Excel 文件

文件夹结构示意:
数据源/
├── 北京分公司/
│   ├── 1月报表.xlsx
│   └── 2月报表.xlsx
├── 上海分公司/
│   ├── Q1汇总.xlsx
│   └── Q2汇总.xlsx
└── 广州分公司/
    └── 年度报表.xlsx
         ↓ Python 自动遍历 + 合并
    ↓
总表.xlsx(包含所有数据)

环境准备

安装依赖库

pip install pandas openpyxl
库名作用
pandas数据处理核心,提供 DataFrame 结构和 concat 合并功能
openpyxlpandas 读取 .xlsx 文件的引擎(必须安装)

完整代码

import os
import pandas as pd
from pathlib import Path

def merge_excel_files(source_dir, output_file="总表汇总.xlsx"):
    """
    遍历指定目录下所有子文件夹中的 Excel 文件,合并为一张总表

    参数:
        source_dir: 包含 Excel 文件的根目录路径
        output_file: 输出汇总文件的文件名
    """
    all_dataframes = []  # 存储所有读取到的 DataFrame
    file_count = 0       # 统计处理的文件数

    # 将路径转为 Path 对象,方便操作
    root_path = Path(source_dir)

    if not root_path.exists():
        print(f"错误:目录 {source_dir} 不存在!")
        return

    # os.walk 递归遍历所有子文件夹
    for dirpath, dirnames, filenames in os.walk(source_dir):
        for filename in filenames:
            # 只处理 .xlsx 和 .xls 文件
            if filename.endswith(('.xlsx', '.xls')) and not filename.startswith('~$'):
                file_path = os.path.join(dirpath, filename)
                file_count += 1

                try:
                    # 读取 Excel 文件(默认读取第一个 sheet)
                    df = pd.read_excel(file_path, engine='openpyxl' if filename.endswith('.xlsx') else 'xlrd')

                    # 可选:添加一列来源信息,记录数据来自哪个文件
                    df['数据来源文件'] = filename
                    df['数据来源路径'] = dirpath

                    all_dataframes.append(df)
                    print(f"[{file_count}] 已读取: {filename}")

                except Exception as e:
                    print(f"[{file_count}] 读取失败 {filename}: {e}")

    if not all_dataframes:
        print("没有找到任何 Excel 文件!")
        return

    # 将所有 DataFrame 纵向拼接(按行合并)
    print("\n正在合并所有数据...")
    merged_df = pd.concat(all_dataframes, ignore_index=True)

    # 导出为新的 Excel 文件
    merged_df.to_excel(output_file, index=False, engine='openpyxl')

    print(f"\n合并完成!")
    print(f"共处理 {file_count} 个文件")
    print(f"总数据行数: {len(merged_df)}")
    print(f"总数据列数: {len(merged_df.columns)}")
    print(f"汇总文件已保存: {output_file}")


# ==================== 使用示例 ====================
if __name__ == "__main__":
    # 修改这里为你的数据文件夹路径
    SOURCE_DIR = r"D:\数据源"

    # 执行合并
    merge_excel_files(SOURCE_DIR, output_file="总表汇总.xlsx")

代码逐行解析

1. 导入模块

import os
import pandas as pd
from pathlib import Path

2. 递归遍历文件夹

for dirpath, dirnames, filenames in os.walk(source_dir):

os.walk() 是 Python 内置的目录遍历函数,它会递归地进入每个子文件夹。每次迭代返回三个值:

变量含义示例
dirpath当前文件夹的完整路径"D:\\数据源\\北京分公司"
dirnames当前文件夹下的子文件夹列表["1月", "2月"]
filenames当前文件夹下的文件列表["1月报表.xlsx", "2月报表.xlsx"]

3. 文件过滤

if filename.endswith(('.xlsx', '.xls')) and not filename.startswith('~$'):

4. 读取 Excel 并标记来源

df = pd.read_excel(file_path, engine='openpyxl')
df['数据来源文件'] = filename
df['数据来源路径'] = dirpath

5. 合并所有数据

merged_df = pd.concat(all_dataframes, ignore_index=True)

pd.concat() 是关键函数:

6. 导出结果

merged_df.to_excel(output_file, index=False, engine='openpyxl')

进阶技巧

技巧 1:指定读取的 Sheet 名称

如果 Excel 文件有多个 Sheet,可以指定读取特定 Sheet:

df = pd.read_excel(file_path, sheet_name="Sheet1", engine='openpyxl')

或读取所有 Sheet 并合并:

all_sheets = pd.read_excel(file_path, sheet_name=None, engine='openpyxl')
for sheet_name, sheet_df in all_sheets.items():
    sheet_df['来源Sheet'] = sheet_name
    all_dataframes.append(sheet_df)

技巧 2:统一列名后再合并

如果不同文件的列名不完全一致,可以先做列名映射:

# 定义统一列名映射
COLUMN_MAP = {
    '姓名': '姓名',
    '员工姓名': '姓名',
    'Name': '姓名',
    '部门': '部门',
    '所属部门': '部门',
    '金额': '金额',
    '金额(元)': '金额',
}

# 读取后统一列名
df = pd.read_excel(file_path)
df.rename(columns=COLUMN_MAP, inplace=True)

技巧 3:添加进度条(大文件友好)

from tqdm import tqdm

for dirpath, dirnames, filenames in tqdm(os.walk(source_dir), desc="扫描文件夹"):
    for filename in filenames:
        # ... 处理逻辑

常见问题

Q1:报错ModuleNotFoundError: No module named 'openpyxl'

原因:没有安装 openpyxl 库,pandas 读取 .xlsx 需要此依赖。

解决:运行 pip install openpyxl

Q2:合并后列的顺序乱了怎么办?

pd.concat() 会自动对齐列名,但列顺序可能不一致。可以手动指定列顺序:

desired_columns = ['姓名', '部门', '金额', '日期', '数据来源文件', '数据来源路径']
merged_df = merged_df[desired_columns]

Q3:某些 Excel 文件读取出来是空的?

可能原因:

建议在读取后加判断:

if df.empty:
    print(f"警告: {filename} 为空,跳过")
    continue

Q4:如何合并 .csv 文件?

只需将读取方式改为 pd.read_csv()

if filename.endswith('.csv'):
    df = pd.read_csv(file_path, encoding='utf-8-sig')

总结

步骤核心函数作用
遍历文件夹os.walk()递归扫描所有子目录
读取文件pd.read_excel()将 Excel 转为 DataFrame
合并数据pd.concat()纵向拼接多个 DataFrame
导出结果to_excel()保存为新的 Excel 文件

本节掌握了 Python 办公自动化中最常用的技能之一——多文件自动合并。无论是财务报表、销售数据还是调查问卷,只要格式一致,都可以用这套代码一键汇总。

以上就是Python实现一键合并多文件夹下百份Excel自动汇总至总表的详细内容,更多关于Python合并多文件夹下Excel的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文