Python办公01:一键合并多文件夹下百份 Excel 自动汇总至总表 目录01一键合并——多文件夹下百份 Excel 自动汇总至总表场景引入技术原理环境准备安装依赖库完整代码代码逐行解析1. 导入模块2. 递归遍历文件夹3. 文件过滤4. 读取 Excel 并标记来源5. 合并所有数据6. 导出结果进阶技巧技巧 1指定读取的 Sheet 名称技巧 2统一列名后再合并技巧 3添加进度条大文件友好常见问题Q1报错 ModuleNotFoundError: No module named openpyxlQ2合并后列的顺序乱了怎么办Q3某些 Excel 文件读取出来是空的Q4如何合并 .csv 文件总结专栏导读 欢迎来到Python办公自动化专栏—Python处理办公问题解放您的双手️‍ 个人博客主页请点击—— 个人的博客主页 求收藏️‍ Github主页请点击—— Github主页 求Star⭐️‍ 知乎主页请点击—— 知乎主页 求关注️‍ CSDN博客主页请点击—— CSDN的博客主页 求关注 该系列文章专栏请点击——Python办公自动化专栏 求订阅 此外还有爬虫专栏请点击——Python爬虫基础专栏 求订阅 此外还有python基础专栏请点击——Python基础学习专栏 求订阅文章作者技术和水平有限如果文中出现错误希望大家能指正❤️ 欢迎各位佬关注 ❤️01一键合并——多文件夹下百份 Excel 自动汇总至总表第一阶段Excel / 数据表高效处理1-8场景引入每月底财务部门的同事小张总会遇到这样的噩梦公司下属 12 个分公司各自把报表放在不同的文件夹里每个文件夹又有 5-10 份 Excel 文件格式基本一致但文件名五花八门。小张需要手动打开每一份文件复制粘贴到汇总表里——每次都要花掉整整半天时间。学完本节你可以用不到 30 行 Python 代码一键遍历所有文件夹、读取所有 Excel 文件自动合并成一张总表全程只需 3 秒钟。技术原理核心思路分三步遍历目录树使用 Python 内置的os.walk()或pathlib递归扫描所有子文件夹读取 Excel 文件使用pandas.read_excel()将每个 Excel 文件读取为 DataFrame纵向拼接使用pandas.concat()将多个 DataFrame 按行合并最后导出为新的 Excel 文件文件夹结构示意 数据源/ ├── 北京分公司/ │ ├── 1月报表.xlsx │ └── 2月报表.xlsx ├── 上海分公司/ │ ├── Q1汇总.xlsx │ └── Q2汇总.xlsx └── 广州分公司/ └── 年度报表.xlsx ↓ Python 自动遍历 合并 ↓ 总表.xlsx包含所有数据环境准备安装依赖库pipinstallpandas openpyxl库名作用pandas数据处理核心提供 DataFrame 结构和 concat 合并功能openpyxlpandas 读取 .xlsx 文件的引擎必须安装完整代码importosimportpandasaspdfrompathlibimportPathdefmerge_excel_files(source_dir,output_file总表汇总.xlsx): 遍历指定目录下所有子文件夹中的 Excel 文件合并为一张总表 参数: source_dir: 包含 Excel 文件的根目录路径 output_file: 输出汇总文件的文件名 all_dataframes[]# 存储所有读取到的 DataFramefile_count0# 统计处理的文件数# 将路径转为 Path 对象方便操作root_pathPath(source_dir)ifnotroot_path.exists():print(f错误目录{source_dir}不存在)return# os.walk 递归遍历所有子文件夹fordirpath,dirnames,filenamesinos.walk(source_dir):forfilenameinfilenames:# 只处理 .xlsx 和 .xls 文件iffilename.endswith((.xlsx,.xls))andnotfilename.startswith(~$):file_pathos.path.join(dirpath,filename)file_count1try:# 读取 Excel 文件默认读取第一个 sheetdfpd.read_excel(file_path,engineopenpyxliffilename.endswith(.xlsx)elsexlrd)# 可选添加一列来源信息记录数据来自哪个文件df[数据来源文件]filename df[数据来源路径]dirpath all_dataframes.append(df)print(f[{file_count}] 已读取:{filename})exceptExceptionase:print(f[{file_count}] 读取失败{filename}:{e})ifnotall_dataframes:print(没有找到任何 Excel 文件)return# 将所有 DataFrame 纵向拼接按行合并print(\n正在合并所有数据...)merged_dfpd.concat(all_dataframes,ignore_indexTrue)# 导出为新的 Excel 文件merged_df.to_excel(output_file,indexFalse,engineopenpyxl)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_DIRrD:\数据源# 执行合并merge_excel_files(SOURCE_DIR,output_file总表汇总.xlsx)代码逐行解析1. 导入模块importosimportpandasaspdfrompathlibimportPathos操作系统接口用于遍历文件夹pandas as pd数据处理库核心工具Path面向对象的路径操作比字符串拼接更安全2. 递归遍历文件夹fordirpath,dirnames,filenamesinos.walk(source_dir):os.walk()是 Python 内置的目录遍历函数它会递归地进入每个子文件夹。每次迭代返回三个值变量含义示例dirpath当前文件夹的完整路径D:\\数据源\\北京分公司dirnames当前文件夹下的子文件夹列表[1月, 2月]filenames当前文件夹下的文件列表[1月报表.xlsx, 2月报表.xlsx]3. 文件过滤iffilename.endswith((.xlsx,.xls))andnotfilename.startswith(~$):endswith((.xlsx, .xls))只处理 Excel 文件not filename.startswith(~$)排除 Excel 的临时锁文件编辑时自动生成4. 读取 Excel 并标记来源dfpd.read_excel(file_path,engineopenpyxl)df[数据来源文件]filename df[数据来源路径]dirpathpd.read_excel()将 Excel 文件读取为 DataFrame类似表格的数据结构添加两列来源信息方便后续追溯数据出处5. 合并所有数据merged_dfpd.concat(all_dataframes,ignore_indexTrue)pd.concat()是关键函数将列表中的所有 DataFrame纵向拼接上下连接ignore_indexTrue重置行索引避免索引重复6. 导出结果merged_df.to_excel(output_file,indexFalse,engineopenpyxl)indexFalse不导出 pandas 自动生成的行号最终得到一个包含所有数据的汇总 Excel 文件进阶技巧技巧 1指定读取的 Sheet 名称如果 Excel 文件有多个 Sheet可以指定读取特定 Sheetdfpd.read_excel(file_path,sheet_nameSheet1,engineopenpyxl)或读取所有 Sheet 并合并all_sheetspd.read_excel(file_path,sheet_nameNone,engineopenpyxl)forsheet_name,sheet_dfinall_sheets.items():sheet_df[来源Sheet]sheet_name all_dataframes.append(sheet_df)技巧 2统一列名后再合并如果不同文件的列名不完全一致可以先做列名映射# 定义统一列名映射COLUMN_MAP{姓名:姓名,员工姓名:姓名,Name:姓名,部门:部门,所属部门:部门,金额:金额,金额(元):金额,}# 读取后统一列名dfpd.read_excel(file_path)df.rename(columnsCOLUMN_MAP,inplaceTrue)技巧 3添加进度条大文件友好fromtqdmimporttqdmfordirpath,dirnames,filenamesintqdm(os.walk(source_dir),desc扫描文件夹):forfilenameinfilenames:# ... 处理逻辑常见问题Q1报错ModuleNotFoundError: No module named openpyxl原因没有安装 openpyxl 库pandas 读取 .xlsx 需要此依赖。解决运行pip install openpyxlQ2合并后列的顺序乱了怎么办pd.concat()会自动对齐列名但列顺序可能不一致。可以手动指定列顺序desired_columns[姓名,部门,金额,日期,数据来源文件,数据来源路径]merged_dfmerged_df[desired_columns]Q3某些 Excel 文件读取出来是空的可能原因文件本身没有数据只有表头文件被加密文件格式不是真正的 Excel如 .csv 改了后缀建议在读取后加判断ifdf.empty:print(f警告:{filename}为空跳过)continueQ4如何合并 .csv 文件只需将读取方式改为pd.read_csv()iffilename.endswith(.csv):dfpd.read_csv(file_path,encodingutf-8-sig)总结步骤核心函数作用遍历文件夹os.walk()递归扫描所有子目录读取文件pd.read_excel()将 Excel 转为 DataFrame合并数据pd.concat()纵向拼接多个 DataFrame导出结果to_excel()保存为新的 Excel 文件本节掌握了 Python 办公自动化中最常用的技能之一——多文件自动合并。无论是财务报表、销售数据还是调查问卷只要格式一致都可以用这套代码一键汇总。下一节预告02精准拆分——按城市/部门将总表数据秒拆成独立文件学完本节后你会知道如何反向操作把一张大表按条件拆分成多个文件结尾希望对初学者有帮助致力于办公自动化的小小程序员一枚希望能得到大家的【❤️一个免费关注❤️】感谢求个 关注 ❤️ 喜欢 ❤️ 收藏 此外还有办公自动化专栏欢迎大家订阅Python办公自动化专栏此外还有爬虫专栏欢迎大家订阅Python爬虫基础专栏此外还有Python基础专栏欢迎大家订阅Python基础学习专栏