查看: 122|回复: 0

Python使用Spire.XLS解析Excel单元格图片图表实战

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在Python后端开发中,解析Excel文件往往不只是读取文本数据,还可能需要同时处理单元格内的多种数据类型、提取工作表中嵌入的图片,以及把Excel图表批量导出为图片。这些需求常见于自动化报表、数据迁移、文档解析服务等场景。如果只依赖常规Excel库,往往需要组合多个模块才能完成,而且在没有安装Office的服务器上很难稳定运行。

本文基于Free Spire.XLS for Python实现一套完整的Excel解析方案,覆盖以下四个核心能力:
1. 批量读取工作表有效区域的单元格数据
2. 区分文本、数字、公式、日期、布尔值等数据类型
3. 提取工作表中的内嵌图片并保存为PNG文件
4. 将Excel图表批量导出为图片

整套方案不需要安装Microsoft Office或WPS,组件以轻量API形式提供,适合集成到服务端脚本或自动化处理任务中。

一、环境安装

该组件支持通过pip安装,适配Python 3.0及以上版本。安装时只安装Excel解析核心模块,没有额外捆绑依赖,安装包体积较小。

安装命令如下:
  1. pip install spire.xls.free
复制代码

如果机器上存在多个Python版本,需要根据实际使用的解释器选择对应的安装方式:
  1. pip3 install spire.xls.free
复制代码
  1. python -m pip install spire.xls.free
复制代码

安装完成后,直接导入模块即可开始使用,无需手动配置系统变量:
  1. import spire.xls
复制代码

二、批量读取工作表单元格数据

在处理大量Excel数据时,不需要遍历整张工作表的所有行列,只需读取工作表实际被使用的区域,能显著减少无效遍历次数。组件通过AllocatedRange属性获取这个有效区域,其内部已经排除了空白行列。

核心实现代码如下:
  1. from spire.xls import *
  2. # 初始化工作簿并加载Excel文件
  3. wb = Workbook()
  4. wb.LoadFromFile("Input.xlsx")
  5. # 获取第一个工作表
  6. sheet = wb.Worksheets[0]
  7. # 获取工作表已占用的数据区域
  8. locatedRange = sheet.AllocatedRange
  9. # 双层遍历所有单元格并打印数据
  10. for i in range(len(locatedRange.Rows)):
  11.     for j in range(len(locatedRange.Rows[i].Columns)):
  12.         print(locatedRange[i + 1, j + 1].Value + " ", end='')
  13.     print("")
复制代码

这段代码有两个细节值得注意:

1. AllocatedRange判断的是工作表中有数据的有效区域,因此循环范围不会扩散到无限空行,读取效率更高。
2. 单元格索引从1开始计数,符合Excel原生行列编号规则,不需要额外做索引换算。

三、精准解析不同类型单元格数据

Excel单元格中可能存有文本、纯数字、公式、日期、布尔值等不同格式的数据。如果直接用Value属性获取,返回的往往是一个通用值,无法准确判断原始类型。对于需要精细化处理数据类型的业务,建议按不同属性分别取值。

示例代码如下:
  1. # 按行列号获取指定单元格
  2. cell = sheet.Range[row, column]
  3. # 按不同类型获取内容
  4. text = cell.Text                 # 文本格式内容
  5. number = cell.NumberValue        # 纯数值内容
  6. formula = cell.Formula           # 原始公式文本
  7. formulaResult = cell.FormulaValue # 公式计算结果
  8. date = cell.DateTimeValue        # 日期类型数据
  9. boolean = cell.BooleanValue      # 布尔类型数据
  10. value = cell.Value               # 通用值,数字/文本自适应
  11. value2 = cell.Value2             # 基于对象的原始值
复制代码

实际开发中常见的问题场景如下:

- 公式单元格:Formula返回公式本身,FormulaValue返回Excel计算后的结果。两种取值方式可分别用于公式校验和结果回填。
- 日期单元格:DateTimeValue返回可直接使用的日期对象,免去手动解析字符串再转换成日期对象的步骤。
- 特殊格式单元格:Value2返回原始对象数据,适合处理自定义格式、混合类型等普通接口无法准确识别的情况。

四、批量提取工作表内嵌图片

很多Excel文件中会嵌入业务截图、产品图片或凭证图片,这类图片资源无法通过读取单元格文本的方式获取。组件将工作表内的所有图片放在Pictures集合中,通过遍历集合即可将图片导出为独立文件。

核心代码如下:
  1. from spire.xls import *
  2. workbook = Workbook()
  3. workbook.LoadFromFile("Input.xlsx")
  4. sheet = workbook.Worksheets[0]
  5. # 倒序遍历工作表所有图片并批量导出
  6. for i in range(sheet.Pictures.Count - 1, -1, -1):
  7.     pic = sheet.Pictures[i]
  8.     pic.Picture.Save("ExtractImages\\Image-{0:d}.png".format(i), ImageFormat.get_Png())
复制代码

这里特意采用倒序遍历而非正序遍历。原因是正序删除或操作集合中的元素时,后续元素的索引会发生变化,容易导致部分图片被跳过。倒序遍历从集合末尾开始操作,每个元素索引都不受前面删除的影响,可避免元素遗漏。

Pictures.Count能准确统计当前工作表所有内嵌图片数量。导出时默认保存为无损PNG格式,图片清晰度与原图保持一致。保存路径和文件名前缀可以根据项目需求灵活修改。

五、Excel图表批量导出为图片

Excel中的柱状图、折线图、饼图等图表对象,不能像单元格那样直接读取文本。组件提供了SaveChartAsImage方法,可把整个工作表中的所有图表一次性转换为图像字节流,再逐个写入图片文件。

核心代码如下:
  1. from spire.xls import *
  2. workbook = Workbook()
  3. workbook.LoadFromFile(r"C:\Users\Administrator\Desktop\Input.xlsx")
  4. sheet = workbook.Worksheets[0]
  5. # 将工作表所有图表转为图像流
  6. image_streams = workbook.SaveChartAsImage(sheet)
  7. # 遍历图像流并批量保存
  8. for i, image_stream in enumerate(image_streams):
  9.     image_stream.Save(f"Output/chart-{i}.png")
  10. # 释放工作簿资源
  11. workbook.Dispose()
复制代码

该方法的优势在于不需要逐个定位图表对象,一次调用即可获得当前工作表中全部图表的图像流。基于流对象保存文件在批量场景下读写效率更高,也方便对接后续的上传或存储逻辑。

同时,在批量解析大量Excel文件时,务必调用Dispose方法主动释放文件占用的资源。如果程序长时间运行且反复加载工作簿,不及时释放会造成文件句柄堆积,严重时可能出现内存溢出或文件被占用无法删除的问题。

六、整体技术总结

本文基于Free Spire.XLS for Python实现了Excel全维度解析能力,适合以下场景:

- 自动化报表解析服务
- Excel数据批量导入/导出系统
- 工作表中图片资源的离线归档
- 图表数据可视化二次处理

整套方案不依赖Office或WPS,不需要安装桌面组件,可直接运行在纯服务端环境。API设计比较简洁,加载工作簿后分别通过工作表的单元格属性、图片集合和图表转换接口完成数据采集。

关键接口和属性回顾:

- Workbook.LoadFromFile:加载现有Excel文件
- Worksheet.AllocatedRange:获取有数据的有效区域
- Cell.Range属性:按行列定位单元格
- cell.Text / NumberValue / Formula / FormulaValue / DateTimeValue / BooleanValue:按数据类型取值
- sheet.Pictures:遍历工作表内嵌图片
- workbook.SaveChartAsImage(sheet):将工作表内所有图表转换为图像流
- workbook.Dispose():释放工作簿资源

如果项目需要在Linux服务器下批量处理Excel文件并且同时需要解析文本、图片和图表,这套方案可以直接改造为独立的Python脚本或集成到已有的后端数据管道中。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-9-9 16:07 , Processed in 0.026526 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部