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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 14:36:22