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

 更新时间:2026年06月23日 08:23:47   作者:小庄-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
  • os:操作系统接口,用于遍历文件夹
  • pandas as pd:数据处理库,核心工具
  • 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('~$'):
  • endswith(('.xlsx', '.xls')):只处理 Excel 文件
  • not filename.startswith('~$'):排除 Excel 的临时锁文件(编辑时自动生成)

4. 读取 Excel 并标记来源

df = pd.read_excel(file_path, engine='openpyxl')
df['数据来源文件'] = filename
df['数据来源路径'] = dirpath
  • pd.read_excel() 将 Excel 文件读取为 DataFrame(类似表格的数据结构)
  • 添加两列来源信息,方便后续追溯数据出处

5. 合并所有数据

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

pd.concat() 是关键函数:

  • 将列表中的所有 DataFrame 纵向拼接(上下连接)
  • ignore_index=True 重置行索引,避免索引重复

6. 导出结果

merged_df.to_excel(output_file, index=False, engine='openpyxl')
  • index=False 不导出 pandas 自动生成的行号
  • 最终得到一个包含所有数据的汇总 Excel 文件

进阶技巧

技巧 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 文件读取出来是空的?

可能原因:

  • 文件本身没有数据(只有表头)
  • 文件被加密
  • 文件格式不是真正的 Excel(如 .csv 改了后缀)

建议在读取后加判断:

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的资料请关注脚本之家其它相关文章!

相关文章

  • python将人民币转换大写的脚本代码

    python将人民币转换大写的脚本代码

    python将人民币转换大写的代码,有需要的朋友可以参考下
    2013-02-02
  • Python CSV模块使用实例

    Python CSV模块使用实例

    这篇文章主要介绍了Python CSV模块使用实例,本文将举几个例子来介绍一下Python的CSV模块的使用方法,包括reader、writer、DictReader、DictWriter.register_dialect等,需要的朋友可以参考下
    2015-04-04
  • 基于Python数据分析之pandas统计分析

    基于Python数据分析之pandas统计分析

    这篇文章主要介绍了基于Python数据分析之pandas统计分析,具有很好对参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Pandas库中iloc[]函数的使用方法

    Pandas库中iloc[]函数的使用方法

    在数据分析过程中,很多时候需要从数据表中提取出相应的数据,而这么做的前提是需要先“索引”出这一部分数据,下面这篇文章主要给大家介绍了关于Pandas库中iloc[]函数的使用方法,需要的朋友可以参考下
    2023-01-01
  • Python中try用法、内置异常类型与自定义异常类型拓展案例详解

    Python中try用法、内置异常类型与自定义异常类型拓展案例详解

    在 Python 里,try 语句主要用于异常处理,其作用是捕获并处理代码运行期间可能出现的异常,避免程序因异常而意外终止,这篇文章主要介绍了Python中try用法、内置异常类型与自定义异常类型拓展,需要的朋友可以参考下
    2025-04-04
  • Python打印酷炫日志的方法详解

    Python打印酷炫日志的方法详解

    在Python中,日志是一种非常重要的工具,可以帮助我们更好地了解程序的运行情况,本文将介绍如何使用logging模块来打印炫酷的日志,需要的可以参考一下
    2023-06-06
  • 情人节快乐! python绘制漂亮玫瑰

    情人节快乐! python绘制漂亮玫瑰

    情人节快乐! 这篇文章主要教大家如何用python绘制漂亮玫瑰花,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Python+OpenCV六种实时图像处理详细讲解

    Python+OpenCV六种实时图像处理详细讲解

    OpenCV常用的图像处理为阈值二值化、边缘检测、轮廓检测、高斯滤波、色彩转换、调节对比度。本文主要介绍了利用Python和OpenCV对实时图像进行上述六种操作的详细讲解,感兴趣的可以了解一下。
    2021-11-11
  • python如何实现反向迭代

    python如何实现反向迭代

    这篇文章主要为大家详细介绍了python如何实现反向迭代,进行反向迭代,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • numpy.linspace函数具体使用详解

    numpy.linspace函数具体使用详解

    这篇文章主要介绍了numpy.linspace具体使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论