You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Openpyxl获取sheet._images无法读取的Excel图片信息方法

解决Openpyxl无法读取Excel工作表中可见图片的问题

可能的原因及对应解决方案:

1. 图片嵌入在Shape对象中

Openpyxl的sheet._images仅能获取直接插入工作表的图片,若图片是作为形状填充、或嵌套在控件/图表内,会被归类到shapes集合中。你可以遍历工作表的形状,检查是否包含图片属性:

from openpyxl import load_workbook

wb = load_workbook("your_file.xlsx")
sheet = wb["sheet"]

for shape in sheet.shapes:
    if hasattr(shape, "image"):
        # 获取图片二进制数据
        img_binary = shape.image.data
        # 获取图片文件名
        img_name = shape.image.filename
        # 可将二进制数据写入文件保存
        with open(img_name, "wb") as f:
            f.write(img_binary)

2. 直接解析XLSX压缩包结构

XLSX本质是ZIP压缩文件,所有媒体资源(包括图片)都存在xl/media/目录下。你可以手动解压文件查看,或用代码批量提取所有图片:

import zipfile
from pathlib import Path

xlsx_path = Path("your_file.xlsx")
# 读取ZIP包
with zipfile.ZipFile(xlsx_path, "r") as zip_ref:
    # 筛选所有媒体文件
    media_files = [f for f in zip_ref.namelist() if f.startswith("xl/media/")]
    for file_path in media_files:
        # 提取图片数据
        img_data = zip_ref.read(file_path)
        # 保存到本地
        save_name = Path(file_path).name
        with open(save_name, "wb") as f:
            f.write(img_data)

注:这种方法会提取整个工作簿的所有图片,若需对应到指定工作表,可进一步解析xl/drawings/目录下的XML文件,通过sheetId关联图片与工作表。

3. 使用Windows COM接口读取(仅Windows环境)

如果你的运行环境是Windows,可以直接调用Excel的COM组件,这能读取Excel中所有可见的图片,不受嵌入方式限制:

import win32com.client as win32

# 启动Excel实例
excel = win32.gencache.EnsureDispatch("Excel.Application")
# 打开工作簿
wb = excel.Workbooks.Open(r"your_file.xlsx")
sheet = wb.Worksheets("sheet")

# 遍历所有形状,筛选图片类型(Type=13)
for shape in sheet.Shapes:
    if shape.Type == 13:
        # 导出图片到指定路径
        shape.Export(rf"./extracted_{shape.Name}.png")

# 关闭工作簿,退出Excel
wb.Close(SaveChanges=False)
excel.Quit()

内容的提问来源于stack exchange,提问作者Oliver Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:02:13