Python自动化合并Excel文件实战指南

发布时间:2026/9/12 17:43:41
Python自动化合并Excel文件实战指南 1. 项目背景与需求分析在日常办公场景中我们经常会遇到需要合并多个Excel文件的情况。特别是当这些文件具有相同的表头结构时手动复制粘贴不仅效率低下还容易出错。最近接手了一个数据整理项目需要将市场部门提供的12个地区销售报表合并成一个总表每个文件都包含日期、产品编号、销售额、负责人这四个完全相同的列标题。这种重复性工作显然应该交给Python自动化处理。通过调研发现市面上虽然有不少Excel合并工具但大多需要付费或者存在功能限制。而用Python自己写脚本不仅能完美适配特定需求还能随时调整合并规则比如只合并特定工作表、过滤无效数据等。2. 技术方案选型2.1 核心库对比Python处理Excel主要有以下几个主流方案openpyxl优点纯Python实现不依赖Excel软件缺点处理大文件时内存占用高xlrd/xlwt优点历史悠久的经典库缺点xlwt仅支持.xls格式xlrd已停止维护pandas优点接口简洁内置合并功能缺点需要安装整个数据分析生态pyxlsb优点支持二进制.xlsb格式缺点使用场景较窄最终选择pandas作为解决方案因为其DataFrame结构天然适合表格数据处理内置concat()等合并函数可以无缝对接后续的数据分析流程2.2 环境准备推荐使用Python 3.8版本安装依赖pip install pandas openpyxl注意虽然pandas依赖openpyxl处理.xlsx文件但不需要直接调用openpyxl的API3. 实现步骤详解3.1 文件遍历与读取首先需要获取待合并的Excel文件列表。假设所有文件都存放在./sales_data/目录下import os import pandas as pd input_dir ./sales_data/ output_file merged_sales.xlsx # 获取目录下所有Excel文件 excel_files [f for f in os.listdir(input_dir) if f.endswith(.xlsx) or f.endswith(.xls)]3.2 数据合并核心逻辑使用pandas的concat函数进行纵向合并def merge_excel_files(file_list, output_path): dfs [] for file in file_list: file_path os.path.join(input_dir, file) # 读取Excel假设所有数据都在第一个sheet df pd.read_excel(file_path, sheet_name0) # 添加来源标记 df[数据来源] file dfs.append(df) # 纵向合并所有DataFrame merged_df pd.concat(dfs, ignore_indexTrue) # 保存结果 merged_df.to_excel(output_path, indexFalse) return merged_df.shape3.3 异常处理增强实际应用中需要考虑以下异常情况try: for file in file_list: file_path os.path.join(input_dir, file) # 检查文件是否可读 if not os.access(file_path, os.R_OK): print(f警告无法读取文件 {file}) continue df pd.read_excel(file_path) # 检查必要列是否存在 required_columns [日期, 产品编号, 销售额] if not all(col in df.columns for col in required_columns): print(f警告{file} 缺少必要列) continue dfs.append(df) except Exception as e: print(f处理文件 {file} 时出错: {str(e)})4. 高级功能扩展4.1 多Sheet合并如果每个Excel包含多个需要合并的Sheetdef merge_multiple_sheets(file_list): dfs [] for file in file_list: xls pd.ExcelFile(file) for sheet_name in xls.sheet_names: df xls.parse(sheet_name) df[来源文件] file df[来源Sheet] sheet_name dfs.append(df) return pd.concat(dfs)4.2 增量合并模式对于定期更新的场景可以只合并新文件def incremental_merge(new_files, existing_file): # 读取已有合并结果 existing_df pd.read_excel(existing_file) # 合并新文件 new_df merge_excel_files(new_files, None) # 去重合并 combined_df pd.concat([existing_df, new_df]).drop_duplicates( subset[日期, 产品编号, 负责人], keeplast ) return combined_df5. 性能优化技巧5.1 内存管理处理大型Excel文件时# 分块读取 chunk_size 10000 reader pd.read_excel(large_file.xlsx, chunksizechunk_size) for chunk in reader: process(chunk)5.2 数据类型优化合并前统一数据类型可提升速度和减少内存dtype_mapping { 产品编号: category, 负责人: category, 销售额: float32 } df df.astype(dtype_mapping)6. 常见问题排查6.1 编码问题遇到中文乱码时df pd.read_excel(file_path, engineopenpyxl)6.2 日期格式不一致统一日期格式df[日期] pd.to_datetime(df[日期], errorscoerce)6.3 合并后数据错位检查列名是否完全一致all_columns set() for df in dfs: all_columns.update(df.columns) print(所有列名:, all_columns)7. 完整代码示例import os import pandas as pd from datetime import datetime def merge_excels(input_dir, output_file, required_colsNone): 合并目录下所有Excel文件 参数: input_dir: 输入目录路径 output_file: 输出文件路径 required_cols: 必要列名列表 start_time datetime.now() excel_files [ f for f in os.listdir(input_dir) if f.lower().endswith((.xlsx, .xls)) ] if not excel_files: print(警告: 未找到Excel文件) return False dfs [] failed_files [] for file in excel_files: try: file_path os.path.join(input_dir, file) df pd.read_excel(file_path, engineopenpyxl) if required_cols and not all(col in df.columns for col in required_cols): print(f跳过 {file}: 缺少必要列) continue df[来源文件] file dfs.append(df) except Exception as e: print(f处理 {file} 失败: {str(e)}) failed_files.append(file) if not dfs: print(错误: 没有有效数据可合并) return False merged_df pd.concat(dfs, ignore_indexTrue) # 保存结果 writer pd.ExcelWriter(output_file, engineopenpyxl) merged_df.to_excel(writer, indexFalse) writer.close() time_used (datetime.now() - start_time).total_seconds() print(f合并完成! 共处理 {len(dfs)} 个文件, 失败 {len(failed_files)} 个) print(f总行数: {len(merged_df)}, 耗时: {time_used:.2f}秒) if failed_files: print(失败文件列表:, failed_files) return True # 使用示例 merge_excels( input_dir./sales_data/, output_file./merged_sales.xlsx, required_cols[日期, 产品编号, 销售额] )8. 实际应用建议日志记录建议添加详细的日志记录记录每个文件的处理状态单元测试对关键函数编写测试用例特别是异常处理逻辑进度显示处理大量文件时可以添加tqdm进度条配置文件将目录路径、必需列等参数提取到配置文件中定时任务配合Windows任务计划或Linux crontab实现自动合并这个方案已经在我们的生产环境运行了6个月每周自动合并约50个地区销售报表平均处理时间在30秒以内。最大的收获是发现有些地区上报的数据存在重复记录后来在合并逻辑中添加了基于业务ID的去重判断使数据质量显著提升。