当前位置: 首页 > news >正文

Python办公01:一键合并多文件夹下百份 Excel 自动汇总至总表

目录

    • 01:一键合并——多文件夹下百份 Excel 自动汇总至总表
    • 场景引入
    • 技术原理
    • 环境准备
      • 安装依赖库
    • 完整代码
    • 代码逐行解析
      • 1. 导入模块
      • 2. 递归遍历文件夹
      • 3. 文件过滤
      • 4. 读取 Excel 并标记来源
      • 5. 合并所有数据
      • 6. 导出结果
    • 进阶技巧
      • 技巧 1:指定读取的 Sheet 名称
      • 技巧 2:统一列名后再合并
      • 技巧 3:添加进度条(大文件友好)
    • 常见问题
      • Q1:报错 `ModuleNotFoundError: No module named 'openpyxl'`
      • Q2:合并后列的顺序乱了怎么办?
      • 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 秒钟。


技术原理

核心思路分三步:

  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(包含所有数据)

环境准备

安装依赖库

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

完整代码

importosimportpandasaspdfrompathlibimportPathdefmerge_excel_files(source_dir,output_file="总表汇总.xlsx"):""" 遍历指定目录下所有子文件夹中的 Excel 文件,合并为一张总表 参数: source_dir: 包含 Excel 文件的根目录路径 output_file: 输出汇总文件的文件名 """all_dataframes=[]# 存储所有读取到的 DataFramefile_count=0# 统计处理的文件数# 将路径转为 Path 对象,方便操作root_path=Path(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_path=os.path.join(dirpath,filename)file_count+=1try:# 读取 Excel 文件(默认读取第一个 sheet)df=pd.read_excel(file_path,engine='openpyxl'iffilename.endswith('.xlsx')else'xlrd')# 可选:添加一列来源信息,记录数据来自哪个文件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_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. 导入模块

importosimportpandasaspdfrompathlibimportPath
  • os:操作系统接口,用于遍历文件夹
  • 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 并标记来源

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')forsheet_name,sheet_dfinall_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:添加进度条(大文件友好)

fromtqdmimporttqdmfordirpath,dirnames,filenamesintqdm(os.walk(source_dir),desc="扫描文件夹"):forfilenameinfilenames:# ... 处理逻辑

常见问题

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 改了后缀)

建议在读取后加判断:

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

Q4:如何合并 .csv 文件?

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

iffilename.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 办公自动化中最常用的技能之一——多文件自动合并。无论是财务报表、销售数据还是调查问卷,只要格式一致,都可以用这套代码一键汇总。

下一节预告:02:精准拆分——按城市/部门将总表数据秒拆成独立文件,学完本节后你会知道如何反向操作,把一张大表按条件拆分成多个文件!

结尾
  • 希望对初学者有帮助;致力于办公自动化的小小程序员一枚
  • 希望能得到大家的【❤️一个免费关注❤️】感谢!
  • 求个 🤞 关注 🤞 +❤️ 喜欢 ❤️ +👍 收藏 👍
  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏
  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏
  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

http://www.gsyq.cn/news/1556814.html

相关文章:

  • 深耕盐城防水领域,匠心守护盐渎安居 微顺虹防水初心筑品质,服务护鹤城万家 - 徽顺虹
  • 从“手工作坊“到“智能工厂“:商业卫星制造的革命性转型
  • 2026年湖北百合种植及种苗产业解析,百合龙头企业权威榜单,四叶参/百合哪家专业 - 新闻快传
  • 爱回收买iWatch靠谱吗?测评博主的一份功课清单 - 新闻快传
  • 语音深度伪造检测:四分类框架解决误判难题
  • 孩子有必要早教么?我纠结了四年,买奇多多后才敢给你标准答案。 - 新闻快传
  • 绘本机有必要买吗?看完奇多多的真实能力,我把选择标准推倒重来 - 新闻快传
  • 从零到一:手把手构建你的第一个浅层神经网络
  • 广州家具安装推荐良匠千艺2026口碑榜 - 我叫一
  • 二手平台哪个更靠谱?2026年四大平台实测,从质检到定价逐项拆解 - 新闻快传
  • 从零上手SSMS:核心功能与实战避坑指南
  • 优质国际EMBA测评:科学选型标准与机构实力解析 - 品牌2026推荐
  • 2026宁波慈溪AI推广公司实测评测与合规推荐 - 起跑123
  • 北京家电维修平台推荐:本地用户实测较好的几家服务商对比——2026年6月最新发布 - 一步到家
  • 谢氏来源证源记录,
  • 【共创季稿事节】 DevEco Code 上手体验:从安装到跑通,我觉得它确实有点东西
  • 2026昆山防水修缮服务行业全景适配指南:核心服务商实力拆解与场景化选型参考 专业防水公司排名推荐(2026年6月防水补漏最新TOP权威排名) - 鼎壹万修缮说
  • 深耕金华防水领域,匠心守护婺州安居 微顺虹防水初心筑品质,服务护金华为家 - 徽顺虹
  • 3步搞定华硕主板风扇控制:FanControl传感器识别终极指南
  • 2026佛山非急救转运救护车TOP5盘点|广佛同城、水乡跨桥、院区转诊首选康跃转运 - 吉修匠
  • 10种方法让生成式AI像专业人士一样编写R代码,提升代码质量!
  • PID控制积分饱和现象解析与抗饱和策略实战
  • 抖音无水印下载神器:3分钟学会批量下载视频、音乐和直播
  • 2026非全日制EMBA测评:科学选型与优质项目推荐 - 品牌2026推荐
  • 卷积神经网络(CNN)原理与工业图像识别实战指南
  • 2026上海变速箱维修门店综合实力榜单|新能源电驱维修首选指南 - 速递信息
  • 2026武汉中职择校指南|武汉光谷科技职业技术学校领跑,全国唯一“海陆空”实训基地+17大热门专业对比,避坑指南 - GrowthUME
  • 黄山GEO服务商代理加盟选型哪家靠谱推荐?2026年黄山GEO优化服务商代理加盟排名与合作路径更新 - 小随科技
  • 优质国际EMBA测评:科学选型与差异化对比指南 - 品牌2026推荐
  • 斑斑AI低代码 vs 搭贝:企业低代码平台深度对比分析