Python 自动化拆分 Excel:Spire.XLS 四种常见场景与实现方式

阿麦
阿麦
发布时间:2026-08-25| 140人浏览过
原创

前言

Excel 文件一旦变大,最耗时间的往往不是录入,而是拆分、筛选和反复另存。本文围绕 Spire.XLS for Python 的四种常见做法展开,把按工作表、按行、按列和按条件拆分分别讲清楚,并保留完整示例代码,方便你按数据结构和业务目标直接选用。

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 步:

  1. 创建 Workbook 对象并加载 Excel 文件;
  2. 遍历工作簿中的所有 Worksheet;
  3. 创建新的 Workbook;
  4. 使用 AddCopy() 方法复制工作表;
  5. 保存生成的 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() 把目标范围复制到新工作簿。

展示按工作表、按行、按列三种拆分方式及其保留格式处理重点的信息图
结构化拆分方式对比把结构化拆分思路放在一张图里,方便快速区分按工作表、按行、按列各自适合解决的问题。

常见步骤如下:

  1. 加载 Excel 文件;
  2. 获取工作表数据行数;
  3. 设置每个文件包含的行数;
  4. 创建新的 Workbook;
  5. 复制指定行数据并保存。

下面的示例演示了如何把第 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() 方法,可以把指定列复制到新工作表中,同时尽量保留原有格式。基本步骤如下:

  1. 创建新的 Workbook;
  2. 添加新的 Worksheet;
  3. 使用 CopyColumn() 复制目标列;
  4. 设置行高并保存文件。

下面示例把第 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、按固定行段、按固定列段。但在实际工作中,更常见的需求往往是按某个字段值自动分类输出,比如按部门、地区、月份、产品线生成多个独立文件。这类需求如果手工做,一般要先筛选、再复制、再新建文件,步骤多且容易漏数据。

展示按部门等字段值分类拆分 Excel 的处理流程和数据流向的信息图
按条件拆分的数据流这张图对应按条件拆分章节,重点说明程序如何读取分类列、按字段值创建工作簿、复制表头并持续追加数据。

更合适的做法,是把某一列作为拆分依据,遍历数据行,按字段值把记录写入不同的工作簿。以员工信息表为例,假设表中包含姓名、部门、职位等字段,现在希望根据“部门”列生成多个文件,例如:

销售部.xlsx

技术部.xlsx

人事部.xlsx

实现流程可以概括为:

  1. 加载 Excel 文件;
  2. 指定拆分依据的列;
  3. 遍历数据行并获取分类值;
  4. 根据分类值创建新的 Workbook;
  5. 复制对应数据行;
  6. 保存生成的 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,只需要逐张独立保存;
  • 按行拆分:适合大数据表分批输出,便于传输、审阅或分段处理;
  • 按列拆分:适合字段隔离、资料裁剪和权限管理;
  • 按条件拆分:适合部门、地区、月份等业务分类场景,自动化价值最高。

如果你的目标是“原样拆开”,优先考虑按工作表、按行、按列;如果你的目标是“按业务规则自动归类”,按条件拆分通常更合适。选对拆分维度后,很多原本靠复制、筛选和另存完成的操作,都可以稳定交给脚本处理。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。