使用 Python 有效压缩 Excel 文件大小:3 种实用思路
Excel 文件过大不仅会占用更多存储空间,还可能增加文件传输和共享的成本,甚至影响工作簿的加载与处理效率。对于需要处理大量 Excel 文件的开发者来说,如何通过代码减小文件体积,是实现高效自动化处理时值得考虑的问题。
使用 Python,可以将 Excel 文件的优化操作集成到自动化流程中。本文将介绍如何借助 Spire.XLS for Python,通过压缩图片、清除多余的单元格格式以及删除不必要的空白行列来减小 Excel 文件大小,并将这些操作整合到一个完整的示例中。
准备工作
Spire.XLS for Python 是一个用于读取、创建和编辑 Excel 文档的 Python 库,无需依赖 Microsoft Excel 即可在代码中处理工作簿。
你可以使用以下命令安装 Spire.XLS for Python:
pip install spire.xls
该组件还提供了免费版,适合用于测试和小型项目。
安装完成后,导入所需模块:
from spire.xls import *
from spire.xls.common import *
方法一:压缩 Excel 工作簿中的图片
如果 Excel 文件包含大量产品图片、截图、图表配图或其他图像资源,图片很有可能是文件体积过大的主要原因。对于这类工作簿,适当降低图片质量可以有效减小 Excel 文件的大小,使其更加方便处理,也不会导致信息缺失。
Spire.XLS for Python 提供了 ExcelPicture.Compress() 方法,可以通过代码压缩工作表中的图片。获取工作表后,遍历其中的图片对象并调用该方法,即可执行压缩操作。
核心代码如下:
# 遍历所有工作表并压缩图片
for i in range(workbook.Worksheets.Count):
sheet = workbook.Worksheets[i]
for picture in sheet.Pictures:
picture.Compress(50)
代码中的 Compress(50) 用于设置图片压缩参数。具体压缩效果取决于图片本身及其原始质量,不能保证所有图片都会以相同的比例缩小。
不过需要注意的是,降低图片质量会影响清晰度。如果工作簿包含需要放大查看的产品细节、技术图纸或高分辨率截图,应先测试合适的压缩参数,并检查压缩后的效果。
方法二:清除 Excel 中多余的单元格格式
有些 Excel 文件虽然实际数据不多,但文件大小却远超预期。这可能与单元格格式应用范围过大有关。例如,工作表中只有前 100 行包含数据,却将整列甚至数千行都设置了边框、填充颜色或字体样式。即使后面的单元格看起来是空白的,这些格式仍可能增加 Excel 工作簿的体积。
如果确认某个区域的格式不再需要,可以使用 Spire.XLS for Python 的 Clear() 方法清除指定区域的格式。
核心代码如下:
# 选择需要清除格式的区域
target_range = sheet.Range["A101:D500"]
# 清除指定区域的单元格格式
target_range.Clear(ExcelClearOptions.ClearFormat)
A101:D500 只是一个用于演示的区域,实际使用时,应根据工作表中的数据分布确定清理范围。ExcelClearOptions.ClearFormat 用于清除目标区域的单元格格式,但不会删除其中的单元格数据。因此,十分适合在想保留数值和文本、移除不必要的样式的情况下使用。
不过,清除格式并不意味着文件一定会明显变小。如果格式本身占用的空间有限,处理前后的文件大小可能相差不大。另外,格式也是工作簿的重要组成部分。对于包含表头样式、条件格式、数字格式或特殊布局的区域,应该注意避免直接清除格式。
方法三:删除不必要的空白行和列
Excel 工作表中有时会存在大量看似空白、实际上却被使用过的行列。例如,用户曾经为很远的单元格设置格式,后来又删除了内容,导致工作表的使用区域超出实际数据范围。这些空白行或列不仅会使 Excel 文件体积变大,还可能影响工具对工作表范围的判断。对此,我们可以通过 Spire.XLS for Python 的 DeleteRow() 和 DeleteColumn() 方法进行清理。
核心代码如下:
# 从最后一行向前检查
for r in range(sheet.LastRow, 0, -1):
if sheet.Rows[r - 1].IsBlank:
sheet.DeleteRow(r)
# 从最后一列向前检查
for c in range(sheet.LastColumn, 0, -1):
if sheet.Columns[c - 1].IsBlank:
sheet.DeleteColumn(c)
代码采用倒序遍历,是因为删除行或列后,后续元素的位置可能发生变化。从末尾向前处理,可以避免删除操作影响尚未检查的前面区域。
IsBlank 用于判断对应的行或列是否为空白。实际使用时,仍应结合当前库版本的 API 行为和工作簿内容进行验证,尤其要注意那些用于模板布局、打印区域或后续数据录入的空白行列。
不建议直接删除所有看起来没有数据的行列。有些空白区域虽然暂时没有内容,却可能承担布局或格式方面的作用。如果工作簿需要保留固定模板、合并单元格、打印布局或预留录入区域,应先明确哪些区域确实可以删除。
整合代码:使用 Python 自动优化 Excel 文件
前面我们介绍了三种减小 Excel 文件大小的方法。在实际开发中,可以根据工作簿的具体情况,将这些操作整合到同一个处理流程中,统一完成图片压缩、单元格格式清理以及空白行列删除。
下面的代码示例会遍历工作簿中的所有工作表,压缩其中的图片,清除指定单元格区域的格式,并删除不必要的空白行列。你可以根据实际需求调整格式清理范围和图片压缩参数。
from spire.xls import *
from spire.xls.common import *
# 输入和输出文件
input_path = "示例文档.xlsx"
output_path = "optimized.xlsx"
# 加载工作簿
workbook = Workbook()
workbook.LoadFromFile(input_path)
# 遍历所有工作表
for i in range(workbook.Worksheets.Count):
sheet = workbook.Worksheets[i]
# 1. 压缩工作表中的图片
for picture in sheet.Pictures:
picture.Compress(50)
# 2. 清除指定区域的单元格格式
sheet.Range["A1:D1"].Clear(
ExcelClearOptions.ClearFormat
)
# 3. 删除不必要的空白行
for r in range(sheet.LastRow, 0, -1):
if sheet.Rows[r - 1].IsBlank:
sheet.DeleteRow(r)
# 删除不必要的空白列
for c in range(sheet.LastColumn, 0, -1):
if sheet.Columns[c - 1].IsBlank:
sheet.DeleteColumn(c)
# 保存优化后的工作簿
workbook.SaveToFile(
output_path,
ExcelVersion.Version2016
)
workbook.Dispose()
print(f"Optimized workbook saved to: {output_path}")

在这份代码中,三种优化操作会依次应用于每个工作表。格式清理默认针对 A1:D1 区域,如果该区域包含需要保留的表头样式或其他格式,应将其调整为确实需要清理的范围。空白行列的删除也应结合实际工作表结构进行判断,以免影响原有布局或后续数据录入。
常见问题
1. 为什么压缩 Excel 文件后,大小没有明显变化?
文件大小的变化取决于工作簿中占用空间的主要内容。如果文件中包含大量高分辨率图片,压缩图片可能比较有效;如果主要问题是多余的单元格格式,则应重点检查格式应用范围。
如果工作簿本身已经经过优化,或者目标区域占用的空间很少,处理前后的文件大小可能不会发生明显变化。因此,建议先检查文件结构,再选择对应的处理方式,而不是对所有工作簿执行完全相同的清理操作。
2. 使用 Python 压缩 Excel 文件会影响原有数据和格式吗?
这取决于执行的操作。压缩图片可能降低图像清晰度;清除单元格格式会移除目标区域的样式;删除空白行列则可能改变工作表布局,甚至影响公式引用、打印区域或模板结构。
为了避免不必要的数据损失,建议将处理结果保存到新文件中。
3. 如何批量压缩多个 Excel 文件?
可以在现有处理流程外层增加目录遍历,逐个读取符合条件的 Excel 文件,再对每个工作簿执行相同的优化操作。
例如,可以使用 Python 的 pathlib 模块查找目录中的 .xlsx 文件,并为每个输入文件生成对应的输出路径。
总结
使用 Python 减小 Excel 文件大小时,首先要找到文件体积过大的原因,再选择相应的处理方式。对于包含大量图片的工作簿,可以使用 Compress() 调整图片压缩质量;对于存在冗余格式的区域,可以通过 Clear(ExcelClearOptions.ClearFormat) 清除不再需要的单元格格式;如果工作表中存在确实可以删除的空白行列,则可以使用 DeleteRow() 和 DeleteColumn() 进行清理。借助 Spire.XLS for Python,还可以将这些操作整合到自动化流程中,减少手动处理多个工作簿的工作量。不过,压缩效果取决于文件本身的结构,清理前也应确认不会影响必要的数据、格式和工作表布局。对于重要文件,建议始终保留原始副本,并在处理后检查工作簿是否仍能正常使用。

浙公网安备 33010602011771号