使用Python一键导出Excel中的图表和形状为图片
作者:缺点内向
在数据处理和报告生成场景中,Excel 文件中的图表和形状往往需要被提取为独立的图片文件,以便用于演示文稿、网页展示或进一步的可视化分析。手动逐项导出的方式效率较低,难以应对批量处理需求。本文将介绍如何利用 Spire.XLS for Python 库,通过 Python 代码将 Excel 工作表中的图表和形状导出为图片,并保存为 PNG、JPG 等常见格式。
该库的一个特点是独立于本地安装的 Microsoft Office 环境运行,可以在服务器端或没有图形界面的 Linux 环境中部署和使用。
环境配置
开始之前,需要通过 pip 安装所需的库:
pip install Spire.XLS
如果使用该库的免费版本,对应的包名为 spire.xls.free。安装完成后,即可在 Python 脚本中引用相关模块。
导出工作表中的图表为图片
对于嵌入在工作表中的图表,可以使用 Workbook.SaveChartAsImage() 方法将其保存为图片流。该方法支持导出单个图表或工作表中的所有图表。
以下示例演示了如何将指定工作表中的所有图表导出为 PNG 图片:
from spire.xls import Workbook
# 创建 Workbook 对象并加载 Excel 文件
workbook = Workbook()
workbook.LoadFromFile("示例.xlsx")
# 获取第一个工作表
sheet = workbook.Worksheets[0]
# 遍历工作表中的所有图表并导出为图片
for i in range(sheet.Charts.Count):
image = workbook.SaveChartAsImage(sheet, i)
image.Save(f"图表_{i}.png")
workbook.Dispose()
如果只需要导出工作表中的特定图表,可以在 SaveChartAsImage 方法中指定图表索引,索引从 0 开始。
导出图表工作表中的图表
在 Excel 中,图表工作表(Chart Sheet)是一种特殊的工作表类型,其整个页面仅用于显示单个图表,不包含单元格数据。针对这种类型,需要使用不同的方法进行导出:
from spire.xls import Workbook
workbook = Workbook()
workbook.LoadFromFile("示例.xlsx")
# 获取第一个图表工作表
chart_sheet = workbook.Chartsheets[0]
# 将图表工作表导出为图片
image = workbook.SaveChartAsImage(chart_sheet)
image.Save("图表工作表.png")
workbook.Dispose()
导出工作表中的形状为图片
除了图表,Excel 工作表中还可能包含文本框、几何形状、组合框等各类形状元素。这些形状可以通过 Worksheet.PrstGeomShapes 属性获取,然后使用 XlsShape.SaveToImage() 方法导出为图片。
from spire.xls import Workbook, XlsShape
workbook = Workbook()
workbook.LoadFromFile("示例.xlsx")
sheet = workbook.Worksheets[0]
# 遍历所有预设几何形状
for i, shape in enumerate(sheet.PrstGeomShapes):
# 将形状转换为 XlsShape 对象
xls_shape = XlsShape(shape)
image = xls_shape.SaveToImage()
image.Save(f"形状_{i}.png")
workbook.Dispose()
对于文本框、复选框等其他类型的元素,可以通过 Worksheet.TextBoxes、Worksheet.CheckBoxes 等属性获取,同样调用 SaveToImage() 方法即可导出。
注意事项
- 图表与图表工作表的区别:
Workbook.SaveChartAsImage(worksheet, index)方法适用于普通工作表中嵌入的图表,而图表工作表需要使用Workbook.SaveChartAsImage(chartsheet)的重载方法。如果混淆这两种调用方式,可能会导致类型错误或无法正确导出。 - 资源释放:操作完成后,调用
workbook.Dispose()有助于及时释放文件句柄和内存资源,避免因重复操作导致的内存占用问题。 - 授权说明:该库提供免费版本供开发测试使用,免费版可能对某些功能或文件处理规模有所限制。在项目集成前,建议查阅其授权条款,确认是否符合使用场景。
知识扩展
在 Python 中一键导出 Excel 中的图表和形状为图片,最可靠的方式是利用 Windows 环境下 Excel 的 COM 接口(win32com)或 xlwings 库,因为它们能调用 Excel 自身的复制、粘贴和导出功能。对于跨平台或不想依赖 Excel 的场景,可使用商业库 Aspose.Cells。
方案一:使用 win32com + Pillow(Windows + Excel)
此方案通过 COM 接口控制 Excel 应用,复制每个形状(包括图表)为图片到剪贴板,再用 Pillow 保存为 PNG 文件。
环境准备
pip install pywin32 pillow
代码实现
import os
import time
import win32com.client as win32
from PIL import ImageGrab
def export_all_shapes(excel_path, output_dir):
"""
导出 Excel 中所有形状(图表、图片、文本框等)为 PNG 图片
:param excel_path: Excel 文件路径
:param output_dir: 输出文件夹路径
"""
if not os.path.exists(output_dir):
os.makedirs(output_dir)
excel = win32.Dispatch("Excel.Application")
excel.Visible = False # 不显示 Excel 窗口
excel.DisplayAlerts = False # 不显示警告
try:
wb = excel.Workbooks.Open(excel_path)
for sheet in wb.Sheets:
for shape in sheet.Shapes:
# 复制形状为图片(带格式)
shape.CopyPicture()
time.sleep(0.1) # 等待剪贴板更新
img = ImageGrab.grabclipboard()
if img and not isinstance(img, list): # 确保是图片对象
safe_name = f"{sheet.Name}_{shape.Name}".replace("/", "_")
img.save(os.path.join(output_dir, f"{safe_name}.png"))
else:
print(f"无法获取形状 '{shape.Name}' 的图片,可能不是图形对象")
wb.Close(SaveChanges=False)
except Exception as e:
print(f"导出失败: {e}")
finally:
excel.Quit()
if __name__ == "__main__":
export_all_shapes("data.xlsx", "./exported_shapes")说明
- 此方法会复制所有形状(包括图表、嵌入图片、文本框、按钮等)为位图格式,并保存为 PNG。
ImageGrab.grabclipboard()可能返回None或列表(当剪贴板中有多个文件时),故需做判断。- 形状名称可能包含特殊字符,建议清理后作为文件名。
- 速度取决于形状数量,大量导出时可能较慢。
方案二:使用 xlwings 导出图表(仅限图表对象)
xlwings 对 Chart 对象有直接的 export 方法,但无法直接导出普通形状(如文本框)。此方案适合只关心图表的情况。
环境准备
pip install xlwings pillow
代码实现
import os
import xlwings as xw
def export_charts_only(excel_path, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
app = xw.App(visible=False, add_book=False)
wb = app.books.open(excel_path)
for sheet in wb.sheets:
for chart in sheet.charts:
# 导出图表为 PNG
chart.export(os.path.join(output_dir, f"{sheet.name}_{chart.name}.png"))
wb.close()
app.quit()
if __name__ == "__main__":
export_charts_only("data.xlsx", "./charts")说明
sheet.charts只返回图表对象,不包括图片、文本框等形状。- 导出的图片格式可自定义(支持 PNG、JPEG、GIF 等)。
- 无需剪贴板操作,速度较快。
方案三:使用 Aspose.Cells(跨平台,商业库)
Aspose.Cells 是专业的 Excel 处理库,支持将图表和形状直接导出为图片,且无需安装 Excel。免费试用版有文件大小和功能限制。
安装
pip install aspose-cells
代码实现
import os
import aspose.cells as ac
def export_with_aspose(excel_path, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
workbook = ac.Workbook(excel_path)
for sheet in workbook.worksheets:
# 导出所有图表
for chart in sheet.charts:
img = chart.to_image()
img.save(os.path.join(output_dir, f"{sheet.name}_{chart.name}.png"))
# 导出所有形状(图片、文本框等)
for shape in sheet.shapes:
# 检查形状是否为图片类型(或其他可导出类型)
if shape.type == ac.ShapeType.PICTURE:
# 获取图片数据
picture = shape.to_image()
picture.save(os.path.join(output_dir, f"{sheet.name}_{shape.name}.png"))
if __name__ == "__main__":
export_with_aspose("data.xlsx", "./aspose_export")说明
chart.to_image()和shape.to_image()可直接保存为图片。- 部分形状(如文本框)可能无法导出,具体需查阅 Aspose 文档。
- 商业许可证需购买,免费试用版会在输出文件中加水印或限制页数。
总结
通过 Spire.XLS for Python 提供的 SaveChartAsImage 和 SaveToImage 方法,可以较为简洁地实现 Excel 中图表和形状的批量导出。这种方法避免了依赖本地 Excel 程序的复杂性,适合在自动化脚本或服务端应用中使用。实际使用时,需要根据图表类型(普通工作表图表或图表工作表)选择合适的方法,并留意资源释放等细节。
到此这篇关于使用Python一键导出Excel中的图表和形状为图片的文章就介绍到这了,更多相关Python导出Excel图表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
