Python在Jupyter中如何从Excel列随机抽取并展示5张单元格图片
Jupyter环境读取Excel指定列图片并随机抽样展示实现
核心原理说明
之前openpyxl、display方案失效的核心原因:Excel内的嵌入式图片不会存储为单元格的value属性,所有图片都挂载在工作表的独立图片资源列表中,通过位置锚点和对应单元格做绑定,直接读取E列单元格值永远拿不到图片对象。
实现步骤
1. 安装所需依赖
在Jupyter代码单元执行以下命令安装依赖:
pip install openpyxl pillow ipython
openpyxl:用于解析xlsx格式的Excel文件,读取嵌入的图片资源pillow:用于处理图片二进制流,生成Jupyter可渲染的图片对象ipython:提供Jupyter内的图片展示能力
注:随机抽样用的
random是Python标准库,无需额外安装
2. 可直接运行的代码
将代码中的文件路径替换为本地Excel的实际路径即可:
from openpyxl import load_workbook from PIL import Image import io import random from IPython.display import display # 加载目标Excel文件,不要加read_only=True参数 wb = load_workbook(filename="你的本地Excel文件.xlsx", data_only=True) # 如果不是第一个工作表,替换成对应表名即可,比如wb["Sheet1"] ws = wb.active # 筛选所有锚定在E列的图片 e_col_images = [] for img in ws._images: # 锚点列索引从0开始计数:A列对应0,E列对应4 img_anchor_col = img.anchor.col if img_anchor_col == 4: # 把图片二进制流转为PIL可识别的图片对象 pil_img = Image.open(io.BytesIO(img._data())) e_col_images.append(pil_img) # 随机无重复抽取5张,若E列总图片数不足5张则取全部 sample_num = min(5, len(e_col_images)) selected_imgs = random.sample(e_col_images, sample_num) # 逐张在Jupyter中展示 print(f"E列共检测到{len(e_col_images)}张图片,随机抽取{sample_num}张展示:") for i, img in enumerate(selected_imgs, 1): print(f"\n第{i}张:") display(img)
常见问题排查
- 加载Excel文件时不要加
read_only=True参数,只读模式下不会加载嵌入的图片资源,会导致图片列表为空 - 如果文件是
.xls后缀的老版本Excel格式,请先另存为.xlsx格式再运行代码,openpyxl不支持老版xls格式解析 - 如果存在图片跨多列摆放的情况,代码默认以图片左上角锚点所在列作为归属判断标准,和Excel视觉上的单元格归属逻辑一致
- 不要尝试通过遍历E列单元格读取
value属性获取图片,该方式拿到的结果永远是None,从Excel存储原理上就走不通
内容的提问来源于stack exchange,提问作者Nomnomc
相关产品推荐
相关产品推荐

