如何快速拆分超大 Excel 文件【Python 教程】

把一份 Excel 拆成多份更小的文件,是日常数据处理里非常常见的需求。比如把含有多张工作表的总表,按工作表拆成每人一份的文档;或者把一张长表按固定行数切块,方便分批交付;又或者把若干列单独抽出来做成独立文件。这些"拆文件"的动作如果用鼠标一个一个点,既慢又容易漏。本文介绍如何用 Spire.XLS for Python 把一份 Excel 文件,按工作表、按行、按列、按单元格区域,分别拆分成多个独立的文件。

为什么需要拆分文件

  • 分发给不同对象:一张总表按工作表或按部门列拆开,每份只含相关内容,避免把无关数据一并发出去。
  • 分批处理与归档:几千行的数据按固定行数切块,既方便逐段核对,也便于按时间或编号归档。
  • 按需抽取维度:把某些关键列单独导出,作为后续分析的输入,而不必总是带着整张宽表。
  • 降低单文件体量:超大工作簿拆成几个小文件后,打开、传输、再处理都更轻快。

与在界面里反复复制粘贴不同,用代码拆分的"拆几块、按什么拆"都变成了参数,跑一次就能稳定产出多份结果。

环境准备

本文使用 Spire.XLS for Python 来读写和拆分 Excel。它在 Workbook 上提供了工作表集合与复制能力,在 Worksheet 上提供了行、列、区域的复制方法,足以支撑下面的各类拆分。通过以下命令安装:

bash 复制代码
pip install Spire.XLS

安装完成后,在脚本中导入所需模块即可使用。

按工作表拆分

当一份工作簿里包含多张工作表时,最直接的需求往往是"每张表导出成一个独立文件"。做法是为源工作簿里的每一张表,新建一个工作簿、把这张表整体复制进去,再分别保存。Worksheets.AddCopy(sheet, WorksheetCopyType.CopyAll) 可以把整张表(含数据、样式、公式)复制进新工作簿,复制前先用 Worksheets.Clear() 清掉新工作簿自带的那张空白表即可。

python 复制代码
from spire.xls import *
from spire.xls.common import *
import os

inputFile = "./示例文档.xlsx"
outputDir = "./按表拆分/"

if not os.path.exists(outputDir):
    os.makedirs(outputDir)

src = Workbook()
src.LoadFromFile(inputFile)

for idx, sheet in enumerate(src.Worksheets):
    newbook = Workbook()
    newbook.Worksheets.Clear()
    newbook.Worksheets.AddCopy(sheet, WorksheetCopyType.CopyAll)
    newbook.SaveToFile(os.path.join(outputDir, f"part_{idx+1}.xlsx"), ExcelVersion.Version2013)
    newbook.Dispose()

src.Dispose()

这里 for idx, sheet in enumerate(src.Worksheets) 直接遍历源工作簿里的所有工作表,无需关心表的总数量。Worksheets.Clear() 会移除新工作簿默认创建的那张空表,随后 AddCopy(sheet, WorksheetCopyType.CopyAll) 把当前表原样塞进新工作簿。每处理完一张就 SaveToFile 存成一个文件,并以 part_序号 命名,最后别忘了 Dispose() 释放资源。

按列拆分

有时一份表很宽,你只想把其中某一列或某几列单独拿出来做文件。Worksheet.Copy() 接受"源列"与"目标列"两个位置,再加上三个开关(是否复制样式、值、公式),就能把指定列搬到一个新工作簿的对应列上。下面演示把前若干列逐列拆成独立文件:

python 复制代码
from spire.xls import *
from spire.xls.common import *
import os

inputFile = "/示例文档.xlsx"
outputDir = "/按列拆分/"

src = Workbook()
src.LoadFromFile(inputFile)
sheet = src.Worksheets[0]

# 获取源表的实际最大行数,确保数据范围完整
last_row = sheet.LastRow

# 假设要把前 3 列分别导出
for c in range(3):
    newbook = Workbook()
    ns = newbook.Worksheets[0]
    
    # 【核心修改】通过具体单元格区域(列范围)进行精准复制
    source_range = sheet.Range[1, c + 1, last_row, c + 1]
    dest_range = ns.Range[1, 1]
    source_range.Copy(dest_range, True)
    
    newbook.SaveToFile(os.path.join(outputDir, f"col_{c+1}.xlsx"), ExcelVersion.Version2013)
    newbook.Dispose()

src.Dispose()

sheet.Range[1, c + 1, last_row, c + 1] 锁定了当前需要导出的具体列范围,并通过 source_range.Copy(dest_range, True) 精准复制到新工作表的首列位置,同时完整保留样式与数据。把循环中的 range(3) 改为对应列数,或换成你关心的具体列索引列表,即可灵活实现任意列的独立拆分。

按行拆分

与按列对应的,是按行切块------最常见的是"每 N 行生成一个文件"。思路是每次取一段连续的行,在新工作簿里从首行开始逐行复制。行的复制同样用 Worksheet.Copy(),只是这次源和目标都是"行"对象。

python 复制代码
from spire.xls import *
from spire.xls.common import *
import os

inputFile = "E:/Administrator/Python/input/世界各洲人口前十国家.xlsx"
outputDir = "E:/Administrator/Python/output/按行拆分/"

src = Workbook()
src.LoadFromFile(inputFile)
sheet = src.Worksheets[0]
last_col = sheet.LastColumn

# 导出前 4 行
book_top = Workbook()
ns_top = book_top.Worksheets[0]
sheet.Range[1, 1, 4, last_col].Copy(ns_top.Range["A1"], True)
book_top.SaveToFile(os.path.join(outputDir, "前4行.xlsx"), ExcelVersion.Version2013)
book_top.Dispose()

# 倒数第 7 行即从 (总行数 - 6) 到 总行数
total_rows = sheet.LastRow
start_row = total_rows - 6

book_bottom = Workbook()
ns_bottom = book_bottom.Worksheets[0]
sheet.Range[start_row, 1, total_rows, last_col].Copy(ns_bottom.Range["A1"], True)
book_bottom.SaveToFile(os.path.join(outputDir, "后7行.xlsx"), ExcelVersion.Version2013)
book_bottom.Dispose()

src.Dispose()

通过 sheet.Range[1, 1, 4, last_col] 与 sheet.Range[start_row, 1, total_rows, last_col] 能够直接截取并锁定特定的行矩阵区域(如前 4 行与最后 7 行)。借助 sheet.LastRow 动态定位总行数并计算出末尾切片坐标,无需复杂的循环逻辑,即可高效、精准地将特定行数据块分别导出为独立文件。

按单元格区域拆分

如果想导出的不是整行整列,而是某个矩形区域(例如指定的局部数据块),可以直接指定源区域与目标区域进行局部截取。下面我们将 A2:F5 这一块局部区域复制到新工作簿的首位置。

python 复制代码
from spire.xls import *
from spire.xls.common import *
import os

inputFile = "示例文档.xlsx"
outputFile = "/局部区域拆分.xlsx"

src = Workbook()
src.LoadFromFile(inputFile)
sheet = src.Worksheets[0]

newbook = Workbook()
ns = newbook.Worksheets[0]

# 指定你想要的源数据局部区域,比如只取 A2 到 F5 
source_range = sheet.Range["A2:F5"]

# 指定新表中存放的目标起始位置
dest_range = ns.Range["A1"]

# 复制目标区域
source_range.Copy(dest_range, True)

newbook.SaveToFile(outputFile, ExcelVersion.Version2013)
newbook.Dispose()
src.Dispose()

sheet.Range["A2:F5"] 定义了你需要截取的源矩形区域,而 ns.Range["A1"] 指定了新表中的粘贴起始点。其中的 True 参数控制在复制时连同单元格样式、边框与背景色一并保留。需要拆分哪一块数据,只需灵活调整源区域的坐标地址(例如将 A2:F5 改为其他范围)即可,其余核心逻辑无需改动。

综合示例:先按工作表、再按行切块

把两种思路串起来,可以处理更复杂的场景------比如一份多工作表的工作簿,先把每张表拆成独立文件,再对其中较大的表按行切块。下面演示先按工作表拆分,再对第一张表做行级切分:

python 复制代码
from spire.xls import *
from spire.xls.common import *
import os

inputFile = "./Demos/Data/SplitExcelCombined.xlsx"
outputDir = "./output_combined"

if not os.path.exists(outputDir):
    os.makedirs(outputDir)

src = Workbook()
src.LoadFromFile(inputFile)

# 第一步:每张工作表导出一个文件
for idx, sheet in enumerate(src.Worksheets):
    newbook = Workbook()
    newbook.Worksheets.Clear()
    newbook.Worksheets.AddCopy(sheet, WorksheetCopyType.CopyAll)
    newbook.SaveToFile(os.path.join(outputDir, f"part_{idx+1}.xlsx"), ExcelVersion.Version2013)
    newbook.Dispose()

# 第二步:对第一张表按每 50 行切块
sheet0 = src.Worksheets[0]
total = sheet0.LastRow
start = 0
part = 1
while start < total:
    end = min(start + 50, total)
    newbook = Workbook()
    ns = newbook.Worksheets[0]
    for r in range(start, end):
        ns.Copy(sheet0.Rows[r], ns.Rows[r - start], True, True, True)
    newbook.SaveToFile(os.path.join(outputDir, f"part1_rows_{part}.xlsx"), ExcelVersion.Version2013)
    newbook.Dispose()
    start = end
    part += 1

src.Dispose()

两段逻辑各自独立:前半段用 AddCopy 按表拆分,后半段用 Worksheet.Copy 按行切块。它们共用的只有"新建工作簿 → 复制 → 保存 → 释放"这一固定套路,因此很容易组合或按需取舍。

实用技巧

  • 先建好输出目录 :拆分会一次性产生很多文件,用 os.makedirs(outputDir, exist_ok=True) 提前把目录准备好,避免首轮就因路径不存在而报错(示例里用 if not os.path.exists 做了同样的事)。
  • 及时 Dispose :每生成一个文件就用 Dispose() 释放该工作簿,处理大量拆分时能有效控制内存占用。
  • 复制开关要选对 :Worksheet.Copy 末尾的三个布尔值分别是"复制样式 / 值 / 公式"。只想保留数值就关掉样式与公式,想完整还原就三个都开。
  • 行数边界用 LastRow :按行切块必须以 sheet.LastRow 或已知行数为边界,既不会漏行,也不会对空白行误操作。
  • 列数不确定时用 Columns.Count :按列拆分若想遍历全部列,把固定列数换成 sheet.Columns.Count 即可,逻辑保持不变。

总结

本文介绍了使用 Python 和 Spire.XLS 拆分 Excel 文件的核心方法。通过"新建工作簿---复制内容---保存释放"的固定流程,你可以根据实际业务需求,将表格灵活拆分为独立文件。掌握这些技巧后,便能用简洁的代码替代繁琐的人工操作,轻松应对分发、归档与分批处理等场景,实现高效的自动化办公。

相关推荐
孟健1 小时前
从单体失控到解耦管道:用 Unix 哲学重构 Anthropic 式多 Agent 动态工作流
人工智能·python·架构
小白快快跑哦1 小时前
python-字符串全解(六):正则表达式-前后相断言
开发语言·python·正则表达式·前后相断言
kimnoic1 小时前
Python数据分析中正则表达式匹配字符串与常用函数示例详解
开发语言·python
许墨の小蝴蝶1 小时前
Pillow 替换图片文字后字号偏小的排查
python·pillow
朝朝辞暮i1 小时前
第 01 讲:Python 变量、对象、数据类型与内存引用
开发语言·python
外收内放2 小时前
Python基础语法练习题(69)
开发语言·python
TomEval2 小时前
【测AI】第11篇:深度学习基础 —— 神经网络是怎么工作的
人工智能·python·深度学习·神经网络·机器学习·aigc
zhang-ge2 小时前
python包和项目管理器uv在ubuntu下的安装与使用
开发语言·python·uv
for_ever_love__2 小时前
LangChain 降级、重试与超时:让服务在模型抽风时还能用
python·自然语言处理·langchain·agent·超时·重试·with_retry