用Python轻松合并Excel文件,告别重复劳动!
- 2026-09-22 19:14:03
工作中经常需要合并多个Excel文件?用pandas几行代码就能搞定,效率提升100倍!
今天要和大家聊聊一个职场高频痛点:合并Excel文件。
一、你是否也遇到过这些场景?
经常性的要合并不同时间段或者销售部门的销售报表,手动复制粘贴到手软
分公司或不同部门各自提交数据,汇总时打开十几甚至几十个Excel文件
多个部门提交表格,字段顺序还不一样,合并时经常错位
数据量一大,Excel直接卡死,复制粘贴更是灾难
如果你中招了,那么恭喜你,今天这篇文章能帮你找到一种方法解决这个问题。
二、准备工作
只需要两个库:
pip install pandas openpyxlpandas:数据处理神器
openpyxl:读写xlsx格式的Excel文件
三、场景一:合并多个结构相同的Excel
假设你有一个文件夹,里面是1-12月的销售数据,每个文件结构完全一样。
sales/├── 1月.xlsx├── 2月.xlsx├── ...└── 12月.xlsx
核心代码:import pandas as pdimport glob import os# 1. 获取所有Excel文件路径folder = 'sales'files = glob.glob(os.path.join(folder,'*.xlsx'))# 2. 批量读取并合并df_list = [pd.read_excel(f) for f in files]result = pd.concat(df_list, ignore_index=True)# 3. 保存结果result.to_excel('合并结果.xlsx', index=False)print(f'共合并 {len(files)} 个文件,{len(result)} 行数据')
就这么简单! 四行核心代码搞定一年的报表合并。
小技巧:保留来源文件名
有时候我们需要知道每行数据来自哪个文件:
df_list = []for f in files:df = pd.read_excel(f)df['来源文件'] = os.path.basename(f) # 新增来源列df_list.append(df)result = pd.concat(df_list, ignore_index=True)
四、场景二:合并多个Sheet
一个Excel里有多个工作表,也想合并:
file_path ='年度数据.xlsx'# 读取所有sheetsheets = pd.read_excel(file_path, sheet_name=None)# 返回字典# 合并所有sheetresult = pd.concat(sheets.values(), ignore_index=True)result.to_excel('合并所有sheet.xlsx', index=False)
如果想要保留sheet名字作为来源标识:
df_list = []for sheet_name, df in sheets.items():df['来源表'] = sheet_namedf_list.append(df)result = pd.concat(df_list, ignore_index=True)
五、场景三:合并字段不一致的Excel
这是比较麻烦的情况——不同文件的列名或顺序不同,甚至有缺失列。
df_list = [pd.read_excel(f) for f in files]# concat会自动对齐列名,缺失的填NaNresult = pd.concat(df_list, ignore_index=True)# 如果列名有细微差异,可以先统一列名rename_map = {'姓名':'name','Name':'name','名字':'name'}for df in df_list:df.rename(columns=rename_map, inplace=True)
pandas的智能对齐:即使A文件有"销售额"列而B文件没有,合并后会自动用NaN填充,不会错位。
六、场景四:只合并指定列
有时候几十列数据我们只需要几列:
usecols =['订单号','客户名称','金额','日期']df_list = [pd.read_excel(f, usecols=usecols) for f in files]result = pd.concat(df_list, ignore_index=True)
用 usecols 参数既能加速读取,又能精简数据。
七、进阶技巧
1. 处理大文件:分批合并
如果文件特别多,可以边读边合并,节省内存:
result = pd.DataFrame()for f in files:df = pd.read_excel(f)result = pd.concat([result, df], ignore_index=True)
2. 加上时间戳,避免覆盖
from datetime import datetimetimestamp = datetime.now().strftime('%Y%m%d_%H%M%S')result.to_excel(f'合并结果_{timestamp}.xlsx', index=False)
3. 输出到多个sheet(按某列拆分)
with pd.ExcelWriter('拆分结果.xlsx') as writer:for dept, group in result.groupby('部门'):group.to_excel(writer, sheet_name=dept, index=False)
八、完整实战案例
把上面的知识串起来,写一个通用合并脚本:
import pandas as pdimport globimport osfrom datetime import datetimedef merge_excel(folder, output_name='合并结果', key_col=None):"""合并文件夹下所有Excel文件:param folder: 文件夹路径:param output_name: 输出文件名:param key_col: 用于拆分的列名(可选)"""files = glob.glob(os.path.join(folder,'*.xlsx'))if not files:print('未找到Excel文件')returndf_list = []for f in files:df = pd.read_excel(f)df['来源文件'] = os.path.basename(f)df_list.append(df)print(f'已读取: {os.path.basename(f)} - {len(df)}行')result = pd.concat(df_list, ignore_index=True)timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')output =f'{output_name}_{timestamp}.xlsx'if key_col and key_col in result.columns:# 按指定列拆分到多个sheetwith pd.ExcelWriter(output) as writer:for key, group in result.groupby(key_col):group.to_excel(writer, sheet_name=str(key)[:31], index= False)print(f'已按"{key_col}"拆分输出到: {output}')else:result.to_excel(output, index=False)print(f'合并完成: {output},共 {len(result)} 行')return result# 使用merge_excel('sales', output_name='销售汇总', key_col='部门')
九、常见问题
Q1:报错"File is not a zip file"?可能文件是xls格式,改用 pd.read_excel(f, engine='xlrd'),或先转换为xlsx。
Q2:日期变成了数字?pandas会自动识别,如果没识别,读取时加 parse_dates=['日期列']。
Q3:合并后顺序乱了?concat 默认按文件读取顺序,如需排序用 result.sort_values('日期')。
Q4:数据量太大内存不够?考虑改用 pd.read_csv 处理CSV,或使用 chunksize 分块读取。
十、总结
pd.concat([...]) | |
read_excel(sheet_name=None) | |
usecols=[] | |
核心思想:把每个Excel读成DataFrame,用 pd.concat 拼接,再一次性写出。整个过程不到10行代码,却可能能节省你几个小时的时间。
学会这招,以后每月的报表合并、数据汇总,就是运行一次脚本的事。把重复劳动交给代码,把时间留给更有价值的事。