每天跟Excel打交道的打工人,谁没被合并零散 Excel 文件的任务折磨过?比如每周收10+门店的销售表、各部门的费用明细,手动复制粘贴不仅要耗半小时,还容易漏行、错行—尤其是遇到带合并单元格、公式的表格,刚粘完发现格式乱了,公式全失效,心态直接崩了。

之前用 pandas 处理过,但 pandas 对 Excel 的格式支持不算友好,合并后经常丢格式、公式失效;后来试了 Free Spire.XLS for Python 免费库,发现它对 Excel 原生格式的支持特别好,合并后的表格能完整保留原有的样式、公式和合并单元格,今天就把我日常用的2种核心合并方案分享出来,覆盖90%的办公场景。


方案概述

日常合并 Excel 就两种核心场景,不用搞复杂,拆明白就能直接用:

  1. 独立工作表模式:每个源文件的表格单独成表,比如合并不同部门的报表,想保留各自的结构,方便按来源查阅;
  2. 追加模式:所有文件的数据汇总到同一个表里,比如汇总所有门店的销售明细,要做统一分析。

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}")

关键说明&避坑点

  1. 工作表命名:复制后会自动生成「原文件名_原工作表名」,比如“华东区报表_销售表”,避免重名,不用手动改;
  2. 资源释放:一定要加Dispose(),否则合并后的文件会被 Python 占用,打不开也删不掉;
  3. 路径问题:路径里别用中文?错!其实支持中文,但要确保文件夹/文件名没有特殊字符(比如*、?、/),否则会加载失败。

效果图

合并Excel


模式二:所有数据合并到同一工作表(汇总同类数据)

适用场景

所有源文件的表格结构完全一致(比如都是销售明细,列名都是「日期、门店、销售额、客单价」),需要把所有数据汇总到一个表做统一分析,比如“统计所有门店本月总销售额”。

完整可运行代码

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)

关键说明&避坑点

  1. 仅复制数据:使用 Range.Copy 方法主要复制值和公式。
  2. 行号管理:通过累加 sheet.LastRow 确定下一段数据的起始行,保证数据连续追加。
  3. 表头处理:上述代码中,第一个文件的表头会被保留,后续文件的表头因从第 1 行开始复制(源表第一行),会一并复制,导致重复表头。若希望只保留一个表头,可将后续文件复制时的起始行改为第 2 行(即 source_range = sheet.Range[2, 1])。

更多推荐