Python 合并 Excel 的2种实用方案
·
每天跟Excel打交道的打工人,谁没被合并零散 Excel 文件的任务折磨过?比如每周收10+门店的销售表、各部门的费用明细,手动复制粘贴不仅要耗半小时,还容易漏行、错行—尤其是遇到带合并单元格、公式的表格,刚粘完发现格式乱了,公式全失效,心态直接崩了。
之前用 pandas 处理过,但 pandas 对 Excel 的格式支持不算友好,合并后经常丢格式、公式失效;后来试了 Free Spire.XLS for Python 免费库,发现它对 Excel 原生格式的支持特别好,合并后的表格能完整保留原有的样式、公式和合并单元格,今天就把我日常用的2种核心合并方案分享出来,覆盖90%的办公场景。
方案概述
日常合并 Excel 就两种核心场景,不用搞复杂,拆明白就能直接用:
- 独立工作表模式:每个源文件的表格单独成表,比如合并不同部门的报表,想保留各自的结构,方便按来源查阅;
- 追加模式:所有文件的数据汇总到同一个表里,比如汇总所有门店的销售明细,要做统一分析。
Free Spire.XLS for Python 是纯 Python 库,不用装 Microsoft Excel 就能读写 Excel 文件,免费版对付日常小文件(单表200行内、5个工作表内)完全够用,刚好满足办公场景的需求。
环境准备
确保 Python 3.7 及以上版本已安装,并执行以下命令安装依赖库:
pip install Spire.Xls.Free
模式一:每个文件独立成表(保留原始结构)
适用场景
合并不同部门/区域的报表,需要保留每个文件的原始结构,后续要按文件来源查阅数据,比如“查3月华东区的报表直接点对应工作表就行”。
完整可运行代码
import os
from spire.xls import *
# ********************* 只需改这两个路径 *********************
input_folder = 'sample_files' # 待合并Excel的文件夹
output_file = 'merged_workbook.xlsx' # 合并后保存的文件
# **********************************************************
# 初始化合并工作簿
merged_workbook = None
# 遍历文件夹里的所有Excel文件
for filename in os.listdir(input_folder):
# 只处理.xlsx/.xls格式,跳过其他文件
if not filename.endswith(('.xlsx', '.xls')):
continue
file_path = os.path.join(input_folder, filename)
print(f"正在处理:{filename}")
# 加载当前Excel文件
source_workbook = Workbook()
source_workbook.LoadFromFile(file_path)
if merged_workbook is None:
# 第一个文件作为合并的基础(保留其原始结构)
merged_workbook = source_workbook
else:
# 把后续文件的每个工作表复制到合并工作簿(保留所有格式)
for i in range(source_workbook.Worksheets.Count):
sheet = source_workbook.Worksheets.get_Item(i)
# CopyAll:复制内容+格式+公式+合并单元格,一步到位
merged_workbook.Worksheets.AddCopy(sheet, WorksheetCopyType.CopyAll)
# 用完及时释放资源,避免文件被占用
source_workbook.Dispose()
# 保存合并后的文件
merged_workbook.SaveToFile(output_file, ExcelVersion.Version2016)
merged_workbook.Dispose()
print(f"合并完成!文件保存在:{output_file}")
关键说明&避坑点
- 工作表命名:复制后会自动生成「原文件名_原工作表名」,比如“华东区报表_销售表”,避免重名,不用手动改;
- 资源释放:一定要加
Dispose(),否则合并后的文件会被 Python 占用,打不开也删不掉; - 路径问题:路径里别用中文?错!其实支持中文,但要确保文件夹/文件名没有特殊字符(比如*、?、/),否则会加载失败。
效果图

模式二:所有数据合并到同一工作表(汇总同类数据)
适用场景
所有源文件的表格结构完全一致(比如都是销售明细,列名都是「日期、门店、销售额、客单价」),需要把所有数据汇总到一个表做统一分析,比如“统计所有门店本月总销售额”。
完整可运行代码
import os
from spire.xls import *
# 待合并文件所在的文件夹路径
input_folder = './excel_worksheets'
# 合并后的输出文件名
output_file = 'merged_into_one_sheet.xlsx'
# 创建新的工作簿作为合并目标
merged_workbook = Workbook()
# 使用第一个工作表作为数据汇总表
merged_sheet = merged_workbook.Worksheets[0]
# 当前写入行号(从1开始)
current_row = 1
# 遍历文件夹中的所有文件
for filename in os.listdir(input_folder):
if filename.endswith('.xlsx') or filename.endswith('.xls'):
file_path = os.path.join(input_folder, filename)
# 加载当前文件
workbook = Workbook()
workbook.LoadFromFile(file_path)
# 获取第一个工作表
sheet = workbook.Worksheets[0]
# 获取已使用区域
source_range = sheet.Range
# 在合并表中定位目标起始单元格
dest_range = merged_sheet.Range[current_row, 1]
# 复制数据
source_range.Copy(dest_range)
# 更新当前行号,指向下一段数据的起始位置
current_row += sheet.LastRow
# 保存合并后的工作簿
merged_workbook.SaveToFile(output_file, ExcelVersion.Version2016)
关键说明&避坑点
- 仅复制数据:使用
Range.Copy方法主要复制值和公式。 - 行号管理:通过累加
sheet.LastRow确定下一段数据的起始行,保证数据连续追加。 - 表头处理:上述代码中,第一个文件的表头会被保留,后续文件的表头因从第 1 行开始复制(源表第一行),会一并复制,导致重复表头。若希望只保留一个表头,可将后续文件复制时的起始行改为第 2 行(即
source_range = sheet.Range[2, 1])。
更多推荐



所有评论(0)