Openpyxl读取Excel图片问题:EMF无法识别、需转rb模式发POST请求
Excel图片提取问题解决方案(基于Openpyxl)
1. Openpyxl无法识别EMF格式图片的解决办法
Openpyxl本身仅支持解析PNG、JPEG这类位图格式,对EMF矢量图没有兼容。如果要提取EMF图片,建议用Windows平台的pywin32库调用Excel原生功能处理,代码示例:
import win32com.client as win32 import os # 启动Excel实例 excel = win32.gencache.EnsureDispatch('Excel.Application') # 打开目标Excel文件 wb = excel.Workbooks.Open(r"你的Excel文件路径") sh = wb.ActiveSheet # 遍历工作表里的所有形状,筛选EMF图片 for shape in sh.Shapes: # 通过形状类型或扩展名判断是否为EMF if shape.Type == 3 and shape.Name.lower().endswith(".emf"): save_path = os.path.join(os.getcwd(), f"{shape.Name}") # 复制图片并导出到本地 shape.CopyPicture() temp_sh = wb.Worksheets.Add() temp_sh.Paste() temp_sh.Shapes(1).Export(save_path) # 删除临时工作表 wb.Worksheets(temp_sh.Name).Delete() # 关闭文件和Excel实例 wb.Close(SaveChanges=False) excel.Quit()
2. 读取PNG/JPEG图片内容用于POST请求
Openpyxl获取到的Image对象里,blob属性就是图片的二进制数据,和你用rb模式读取文件得到的内容完全一致,直接拿来用就行,不用额外存文件再读取。修改你的代码如下:
from openpyxl import load_workbook import requests path = "你的Excel文件路径" wb = load_workbook(path) sh = wb.active # 遍历工作表里的所有图片 for idx, img in enumerate(sh._images): # 获取图片二进制数据 img_data = img.blob # 提取图片扩展名和对应的MIME类型 ext = img.filename.split('.')[-1].lower() mime_type = f'image/{ext}' if ext in ['png', 'jpg', 'jpeg'] else 'image/png' # 构造POST请求的文件参数 files = {'File-Name': (f'image{idx+1}.{ext}', img_data, mime_type)} url = "你的API接口地址" response = requests.post(url, files=files) # 可选:打印上传结果 print(f"第{idx+1}张图片上传状态码:{response.status_code}")
补充说明
img.blob直接返回二进制字节流,完全符合POST请求对文件附件的要求,无需额外转换。- 如果遇到文件名无扩展名的情况,可以通过图片的实际格式反向判断MIME类型,或者参考
img.format属性(部分场景下可用)。
内容的提问来源于stack exchange,提问作者Surya Tej
相关产品推荐
相关产品推荐

