使用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
相关产品推荐
相关产品推荐

