python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python导出Excel图表

使用Python一键导出Excel中的图表和形状为图片

作者:缺点内向

还在手动导出Excel图表吗,本文教你用Python结合Spire.XLS库,轻松将工作表中的图表和形状批量导出为PNG或JPG图片,无需安装Office,代码简单,适合自动化脚本和服务器端处理

在数据处理和报告生成场景中,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.TextBoxesWorksheet.CheckBoxes 等属性获取,同样调用 SaveToImage() 方法即可导出。

注意事项

知识扩展

在 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")

说明

方案二:使用 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")

说明

方案三:使用 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")

说明

总结

通过 Spire.XLS for Python 提供的 SaveChartAsImageSaveToImage 方法,可以较为简洁地实现 Excel 中图表和形状的批量导出。这种方法避免了依赖本地 Excel 程序的复杂性,适合在自动化脚本或服务端应用中使用。实际使用时,需要根据图表类型(普通工作表图表或图表工作表)选择合适的方法,并留意资源释放等细节。

到此这篇关于使用Python一键导出Excel中的图表和形状为图片的文章就介绍到这了,更多相关Python导出Excel图表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文