使用openpyxl-image-loader提取Z列外图片遇IndexError,求解决方案
解决openpyxl-image-loader处理Z列以外图片时的IndexError问题
问题背景
使用openpyxl-image-loader提取xlsm文件中Z列以外区域的图片时,触发IndexError: string index out of range错误,尝试修改库中col = string.ascii_uppercase[image.anchor._from.col]为col = openpyxl.utils.cell.get_column_letter(image.anchor._from.col + 1)后未生效。
根本原因
原库代码依赖string.ascii_uppercase生成列字母,该字符串仅包含A-Z(索引0-25),当图片所在列超过Z列(索引≥26)时,就会因索引越界抛出错误。之前的修改可能仅覆盖了一处逻辑,库源码中可能存在多处相同的错误写法,导致修改无效。
解决方案
方案1:自定义修复后的SheetImageLoader类(推荐)
无需修改第三方库源码,直接继承原类并重写图片位置映射逻辑,避免后续库更新失效:
from openpyxl_image_loader import SheetImageLoader as OriginalLoader from openpyxl.utils.cell import get_column_letter class FixedSheetImageLoader(OriginalLoader): def __init__(self, sheet): super().__init__(sheet) # 重新构建图片与单元格的映射关系 self._images = {} for image in sheet._images: # 转换为正确的列字母(col从0开始计数,需+1) col_letter = get_column_letter(image.anchor._from.col + 1) # 行号从0开始计数,需+1转换为Excel实际行号 row_num = image.anchor._from.row + 1 cell_key = f"{col_letter}{row_num}" self._images[cell_key] = image
使用示例:
import openpyxl # 加载工作簿和工作表 wb = openpyxl.load_workbook('test.xlsm') sheet = wb['Лист3'] # 使用修复后的加载器 image_loader = FixedSheetImageLoader(sheet) # 检查并提取指定单元格的图片 target_cell = "AA1" if image_loader.image_in(target_cell): img = image_loader.get(target_cell) img.save(f"{target_cell}_image.png")
方案2:彻底修改库源码
如果坚持修改库文件,需找到所有使用string.ascii_uppercase处理列索引的地方全部替换:
- 找到openpyxl-image-loader的源码文件(通常路径为
site-packages/openpyxl_image_loader/__init__.py) - 替换所有类似
col = string.ascii_uppercase[xxx.col]的代码为col = get_column_letter(xxx.col + 1),同时确保顶部导入from openpyxl.utils.cell import get_column_letter - 保存文件后重启Python解释器,确保修改生效
注意事项
- 若使用方案1,后续更新openpyxl-image-loader库时无需重复修改
- 确认图片的锚点位置是否正确,部分图片可能使用了多单元格锚点,需根据实际情况调整锚点的
_from或_to属性
内容的提问来源于stack exchange,提问作者Squirrel
相关产品推荐
相关产品推荐

