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

两次调用SheetImageLoader读取同一Excel单元格图片触发I/O已关闭文件错误

问题解决:重复读取Excel单元格图片触发"I/O operation on closed file"错误

问题原因

SheetImageLoader的get方法在读取一次图片后,会关闭关联的文件流,第二次调用同一单元格的get时,就会触发已关闭文件的IO操作错误。

解决方案

方案1:缓存已读取的图片

把第一次读取到的图片存在字典里,后续直接用缓存内容,不用重复调用image_loader.get():

workbook = load_workbook(path)
sheet = workbook.active
image_loader = SheetImageLoader(sheet)

# 用字典缓存已读取的图片
image_cache = {}

def get_cell_image(image_loader, cell_name):
    # 先检查缓存,存在则直接返回副本(避免原数组被意外修改)
    if cell_name in image_cache:
        return image_cache[cell_name].copy()
    # 第一次读取图片并转换格式,存入缓存
    image = image_loader.get(cell_name)
    image_np = np.array(image)
    image_bgr = cv2.cvtColor(image_np, cv2.COLOR_RGB2BGR)
    image_cache[cell_name] = image_bgr
    return image_bgr

# 现在两次调用都能正常执行
get_cell_image(image_loader, 'A2')
get_cell_image(image_loader, 'A2')

方案2:循环内重新初始化加载器

针对两层循环的场景,每次进入内层循环前重新加载工作簿和SheetImageLoader,确保每次读取时文件流处于打开状态:

path = "你的Excel文件路径"

# 外层循环
for _ in outer_loop_items:
    # 每次重新加载工作簿和图片加载器
    workbook = load_workbook(path)
    sheet = workbook.active
    image_loader = SheetImageLoader(sheet)
    
    # 内层循环读取所有图片
    for cell_name in target_cells:
        image = get_cell_image(image_loader, cell_name)
        # 这里编写你的图片处理逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:26:19