Excel 文件一旦同时装下多张工作表、长列表数据和不同业务字段,后续整理就很容易卡在重复操作上:要么逐个另存工作表,要么按批次拆行,要么筛选某列再复制出去。本文用 Spire.XLS for Python 把这几类常见拆分方式串起来讲清楚,读完你可以直接判断自己该选按表、按行、按列,还是按条件拆分,并对照示例代码落地。
环境准备:先把依赖和对象关系理顺
在开始拆分前,先安装依赖。Spire.XLS for Python 是一个面向 Excel 文档处理的组件,支持创建、读取、修改、格式转换等操作,而且不依赖 Microsoft Office。
pip install spire.xls
安装完成后,先导入模块:
from spire.xls import * from spire.xls.common import *
本文会频繁用到下面几个对象,先理解它们,后面的代码更容易看懂:
| 对象 | 作用 |
|---|---|
| Workbook | 表示整个 Excel 工作簿 |
| Worksheet | 表示工作簿中的工作表 |
| Range | 表示单元格区域 |
如果你只是做小型项目验证或测试场景,也可以先从该组件的免费版开始。下面四种拆分方式都基于同一套对象模型,区别主要在于遍历维度和复制方法不同。
按工作表拆分:一个 Sheet 输出一个文件
这是最直接的一类需求。一个工作簿里可能放着不同月份、不同地区,或者不同业务模块的数据,每张工作表都希望独立保存成单独文件。这种情况下,不需要逐页手动“另存为”,直接遍历 Workbook 中的所有 Worksheet,再逐个复制到新工作簿即可。
核心思路可以概括为 5 步:
- 创建
Workbook对象并加载 Excel 文件; - 遍历工作簿中的所有
Worksheet; - 创建新的
Workbook; - 使用
AddCopy()方法复制工作表; - 保存生成的 Excel 文件。
对应代码如下:
from spire.xls import *
from spire.xls.common import *
# 创建 Workbook 对象并加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("/input/示例.xlsx")
# 设置拆分后文件的保存路径
output_path = "/output/按表拆分/"
# 遍历工作簿中的所有工作表
for sheet in workbook.Worksheets:
# 创建新的 Workbook 对象,并删除默认工作表
new_workbook = Workbook()
new_workbook.Worksheets.Clear()
# 将当前工作表复制到新的工作簿中
new_workbook.Worksheets.AddCopy(sheet)
# 以当前工作表名称命名,并保存为独立的 Excel 文件
new_workbook.Sa veToFile(
output_path + sheet.Name + ".xlsx",
FileFormat.Version2016
)
# 释放资源
new_workbook.Dispose()
workbook.Dispose()
这段代码的重点在 AddCopy()。它适合“整张表原样拆出去”的场景,能省掉按单元格逐个复制的过程。运行后,原文件中的每个工作表都会生成一个单独的 .xlsx 文件,文件名直接使用工作表名称。
如果你的源文件本身已经按主题划分好了 Sheet,这种方式通常是成本最低、最稳妥的选择。
按行或按列拆分:处理大表和字段分发更高效
按行拆分:适合把大表分批输出
当一个工作表里的记录数很大时,按固定行数切分成多个文件,会更利于后续传输、归档或分段处理。典型做法是:先获取总行数,再指定每个输出文件要保留多少行,然后利用 CopyRow() 把目标范围复制到新工作簿。

常见步骤如下:
- 加载 Excel 文件;
- 获取工作表数据行数;
- 设置每个文件包含的行数;
- 创建新的
Workbook; - 复制指定行数据并保存。
下面的示例演示了如何把第 1-5 行和第 6-11 行拆成两个文件,其中第二个文件会额外复制表头:
from spire.xls import *
from spire.xls.common import *
# 创建 Workbook 对象并加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("/input/示例.xlsx")
# 获取第一个工作表
worksheet = workbook.Worksheets[0]
# 设置文件保存路径
folderPath = "/output/按行拆分/"
# 将第 1-5 行拆分到新文件
newWorkbook1 = Workbook()
newWorkbook1.Worksheets.Clear()
newWorksheet1 = newWorkbook1.Worksheets.Add("Sheet1")
for i in range(1, 6):
worksheet.CopyRow(
worksheet.Rows[i - 1],
newWorksheet1,
newWorksheet1.LastDataRow + 1,
CopyRangeOptions.All
)
# 复制列宽
for i in range(worksheet.Columns.Count):
newWorksheet1.SetColumnWidth(
i + 1,
worksheet.GetColumnWidth(i + 1)
)
newWorkbook1.Sa veToFile(folderPath + "1-5行.xlsx", FileFormat.Version2016)
newWorkbook1.Dispose()
# 将第 6-11 行拆分到新文件(先复制表头)
newWorkbook2 = Workbook()
newWorkbook2.Worksheets.Clear()
newWorksheet2 = newWorkbook2.Worksheets.Add("Sheet1")
# 复制表头(第1行)
worksheet.CopyRow(
worksheet.Rows[0],
newWorksheet2,
newWorksheet2.LastDataRow + 1,
CopyRangeOptions.All
)
# 复制第6-11行数据
for i in range(6, 12):
worksheet.CopyRow(
worksheet.Rows[i - 1],
newWorksheet2,
newWorksheet2.LastDataRow + 1,
CopyRangeOptions.All
)
for i in range(worksheet.Columns.Count):
newWorksheet2.SetColumnWidth(
i + 1,
worksheet.GetColumnWidth(i + 1)
)
newWorkbook2.Sa veToFile(folderPath + "6-11行.xlsx", FileFormat.Version2016)
newWorkbook2.Dispose()
workbook.Dispose()
这里有两个容易忽略的点。第一,分批导出时是否保留表头,要根据后续用途决定;第二,复制完数据后,如果不补上列宽,新文件虽然内容完整,但阅读体验可能会明显变差。因此示例中额外使用了 SetColumnWidth() 来同步列宽。
按列拆分:适合字段隔离和权限分发
并不是所有拆分都围绕“记录行”展开。有些时候,一张表里同时包含基础资料、业务数据、财务字段或敏感信息,真正需要的是把不同列段分别导出给不同角色查看。这时按列拆分会比按行拆分更贴近业务。
Spire.XLS 提供了 CopyColumn() 方法,可以把指定列复制到新工作表中,同时尽量保留原有格式。基本步骤如下:
- 创建新的
Workbook; - 添加新的
Worksheet; - 使用
CopyColumn()复制目标列; - 设置行高并保存文件。
下面示例把第 1-2 列、第 3-5 列和第 6 列分别拆成三个文件:
from spire.xls import *
from spire.xls.common import *
workbook = Workbook()
workbook.LoadFromFile("/input/示例.xlsx")
worksheet = workbook.Worksheets[0]
folderPath = "/output/按列拆分/"
# 拆分第 1-2 列(A-B列)
newWorkbook1 = Workbook()
newWorkbook1.Worksheets.Clear()
newWorksheet1 = newWorkbook1.Worksheets.Add("Sheet1")
for i in range(1, 3):
worksheet.CopyColumn(
worksheet.Columns[i - 1],
newWorksheet1,
newWorksheet1.LastDataColumn + 1,
CopyRangeOptions.All
)
for i in range(worksheet.Rows.Count):
newWorksheet1.SetRowHeight(i + 1, worksheet.GetRowHeight(i + 1))
newWorkbook1.Sa veToFile(folderPath + "AB.xlsx", FileFormat.Version2016)
newWorkbook1.Dispose()
# 拆分第 3-5 列(C-E列)
newWorkbook2 = Workbook()
newWorkbook2.Worksheets.Clear()
newWorksheet2 = newWorkbook2.Worksheets.Add("Sheet1")
for i in range(3, 6):
worksheet.CopyColumn(
worksheet.Columns[i - 1],
newWorksheet2,
newWorksheet2.LastDataColumn + 1,
CopyRangeOptions.All
)
for i in range(worksheet.Rows.Count):
newWorksheet2.SetRowHeight(i + 1, worksheet.GetRowHeight(i + 1))
newWorkbook2.Sa veToFile(folderPath + "CDE.xlsx", FileFormat.Version2016)
newWorkbook2.Dispose()
# 拆分第 6 列(F列)
newWorkbook3 = Workbook()
newWorkbook3.Worksheets.Clear()
newWorksheet3 = newWorkbook3.Worksheets.Add("Sheet1")
worksheet.CopyColumn(
worksheet.Columns[5],
newWorksheet3,
newWorksheet3.LastDataColumn + 1,
CopyRangeOptions.All
)
for i in range(worksheet.Rows.Count):
newWorksheet3.SetRowHeight(i + 1, worksheet.GetRowHeight(i + 1))
newWorkbook3.Sa veToFile(folderPath + "F.xlsx", FileFormat.Version2016)
newWorkbook3.Dispose()
workbook.Dispose()
和按行拆分类似,按列拆分时也要关注格式继承问题。示例里专门同步了行高,就是为了避免新文件在视觉上出现挤压或错位。对于需要按字段权限拆分、向不同团队投递不同列信息的场景,这种方式通常比人工删除列再另存更可靠。
按指定条件拆分:更贴近实际业务规则
前面三种方式更偏“结构拆分”:按 Sheet、按固定行段、按固定列段。但在实际工作中,更常见的需求往往是按某个字段值自动分类输出,比如按部门、地区、月份、产品线生成多个独立文件。这类需求如果手工做,一般要先筛选、再复制、再新建文件,步骤多且容易漏数据。

更合适的做法,是把某一列作为拆分依据,遍历数据行,按字段值把记录写入不同的工作簿。以员工信息表为例,假设表中包含姓名、部门、职位等字段,现在希望根据“部门”列生成多个文件,例如:
销售部.xlsx
技术部.xlsx
人事部.xlsx
实现流程可以概括为:
- 加载 Excel 文件;
- 指定拆分依据的列;
- 遍历数据行并获取分类值;
- 根据分类值创建新的
Workbook; - 复制对应数据行;
- 保存生成的 Excel 文件。
对应代码如下:
from spire.xls import *
from spire.xls.common import *
# 加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("/员工信息.xlsx")
# 获取第一个工作表
worksheet = workbook.Worksheets[0]
# 输出目录
folderPath = "/output/按条件拆分/"
# 用于保存不同部门对应的 Workbook
department_books = {}
# 获取总行数
row_count = worksheet.Rows.Count
# 设置按部门拆分(假设部门在第3列)
department_column = 3
# 遍历数据行(跳过表头)
for i in range(1, row_count):
# 获取部门名称
department = worksheet.Range[i + 1, department_column].Value
if department not in department_books:
# 创建新的 Workbook
newWorkbook = Workbook()
newWorkbook.Worksheets.Clear()
newWorksheet = newWorkbook.Worksheets.Add("Sheet1")
# 复制表头
worksheet.CopyRow(
worksheet.Rows[0],
newWorksheet,
newWorksheet.LastDataRow + 1,
CopyRangeOptions.All
)
department_books[department] = newWorkbook
# 获取目标 Sheet
newWorksheet = department_books[department].Worksheets[0]
# 复制当前行
worksheet.CopyRow(
worksheet.Rows[i],
newWorksheet,
newWorksheet.LastDataRow + 1,
CopyRangeOptions.All
)
# 保存文件
for department, wb in department_books.items():
wb.Sa veToFile(
folderPath + department + ".xlsx",
FileFormat.Version2016
)
wb.Dispose()
workbook.Dispose()
这段代码的关键在于用一个字典 department_books 管理不同分类值对应的工作簿。程序每读到一行数据,就先取出部门名称;如果这个部门还没有对应的输出文件,就先创建一个新工作簿并复制表头;如果已经存在,就直接把当前行追加进去。
这种写法很适合扩展。虽然示例里拆分依据是“部门”列,但你完全可以把它换成地区、日期、门店、客户等级等任意分类字段。只要字段值能稳定区分记录,就能沿用同样的处理逻辑。
怎么选拆分方式:从数据结构和业务目的判断
把 Excel 拆分自动化之后,真正节省下来的不是一次性脚本时间,而是后续每轮重复整理的人工成本。Spire.XLS for Python 覆盖的这四类方式,基本对应了大多数日常办公和数据处理场景。
- 按工作表拆分:适合原文件本身已经按主题分 Sheet,只需要逐张独立保存;
- 按行拆分:适合大数据表分批输出,便于传输、审阅或分段处理;
- 按列拆分:适合字段隔离、资料裁剪和权限管理;
- 按条件拆分:适合部门、地区、月份等业务分类场景,自动化价值最高。
如果你的目标是“原样拆开”,优先考虑按工作表、按行、按列;如果你的目标是“按业务规则自动归类”,按条件拆分通常更合适。选对拆分维度后,很多原本靠复制、筛选和另存完成的操作,都可以稳定交给脚本处理。









