openpyxl 3.0.9读取含损坏图片的Excel表格时触发KeyError异常问题
openpyxl 读取含损坏图片的Excel文件抛出KeyError的解决方案
问题根因
报错由目标Excel文件元数据损坏导致:文件内某张图片的绘图关系记录指向了不存在的xl/drawings/NULL路径。LibreOffice的容错机制会自动跳过不存在的资源仅显示占位符,openpyxl 3.0.9版本的默认读取逻辑未对这类异常做捕获,因此直接抛出错误。
解决方案
方案1:不需要读取图片时直接绕过(最便捷)
调用load_workbook时添加ignore_images=True参数,跳过所有图片的解析流程,不会影响表格文本/数值内容的读取:
wb = load_workbook('pritelli/FW21 WOMAN 27.09.21.xlsx', ignore_images=True)
方案2:必须保留图片读取能力时修改源码容错
找到对应Python环境下的openpyxl/reader/drawings.py文件,定位到find_images函数中读取图片的代码段,添加异常捕获逻辑跳过损坏资源:
# 原有代码 # image = Image(BytesIO(archive.read(dep.target))) # images.append(image) # 修改为以下代码 try: img_bin = archive.read(dep.target) image = Image(BytesIO(img_bin)) images.append(image) except KeyError: # 跳过不存在的损坏图片资源,不抛出异常 pass
方案3:升级openpyxl版本
该类资源不存在的异常捕获逻辑已在openpyxl 3.1及以上版本修复,直接升级到最新稳定版即可原生解决问题:
pip install --upgrade openpyxl
方案4:修复源文件
用LibreOffice打开目标Excel,找到显示占位符的异常图片,删除后重新插入原图并保存,修复后的文件即可直接被openpyxl 3.0.9正常读取。
内容的提问来源于stack exchange,提问作者aikipooh
相关产品推荐
相关产品推荐

