Excel内嵌图片批量导出异常:代码误判所有行无图片数据求助
Excel内嵌图片导出失败:全量判定为空的解决方法
问题场景
有包含serial_number(序号)、name(名称)、photo(图片)列的Excel表格,需按[serial_number][name].jpg规则导出所有图片。执行给定Python代码后,所有行均被判定为无图片数据并跳过,但表格内实际存在图片。
原代码及执行输出如下:
原代码:
import pandas as pd from PIL import Image import io import numpy as np # Import numpy for NaN checking # Read the Excel file df = pd.read_excel('Batch-1.xlsx') # Iterate through rows for index, row in df.iterrows(): serial_number = row['sl'] name = row['name'] photo_data = row['photo'] # Check if photo_data is NaN (float in pandas) if isinstance(photo_data, float) and np.isnan(photo_data): print(f"No photo data found for row {index + 1}. Skipping...") continue # Convert bytes data to image image = Image.open(io.BytesIO(photo_data)) # Save the image with the specified file name convention file_name = f"{serial_number} {name}.jpg" image.save(file_name) print(f"Photo saved: {file_name}")
执行输出:
No photo data found for row 1. Skipping... No photo data found for row 2. Skipping... ...(省略后续行) No photo data found for row 30. Skipping...
问题原因
- Pandas不支持读取内嵌图片:
pd.read_excel()默认仅读取单元格的文本/数值数据,Excel内嵌的图片不会被解析到DataFrame中,对应photo列的单元格会被识别为NaN,触发代码中的跳过逻辑。 - 列名不匹配:代码中使用
row['sl']获取序号,但表格实际列名为serial_number,会导致序号读取错误(可能返回NaN)。
解决方案
改用openpyxl库读取Excel中的内嵌图片,并将图片与对应行的serial_number、name关联,具体步骤如下:
1. 安装依赖
确保安装openpyxl和Pillow:
pip install openpyxl pillow pandas
2. 修正后的代码
import pandas as pd from openpyxl import load_workbook from openpyxl.drawing.image import Image as OpenpyxlImage from PIL import Image import io # 读取Excel数据和图片 wb = load_workbook('Batch-1.xlsx') ws = wb.active # 读取表格数据(获取serial_number和name列) df = pd.read_excel('Batch-1.xlsx', usecols=['serial_number', 'name']) # 遍历所有内嵌图片 for img in ws._images: # 获取图片所在的单元格位置 img_cell = img.anchor._from row_idx = img_cell.row - 1 # 转换为DataFrame的索引(从0开始) # 确保行索引在DataFrame范围内 if row_idx >= len(df): print(f"图片所在行超出数据范围,跳过...") continue # 获取对应行的序号和名称 serial_number = df.loc[row_idx, 'serial_number'] name = df.loc[row_idx, 'name'] # 将openpyxl图片转换为PIL格式并保存 img_bytes = io.BytesIO(img._data()) pil_img = Image.open(img_bytes) # 按规则命名文件 file_name = f"{serial_number}{name}.jpg" pil_img.save(file_name, 'JPEG') print(f"图片已保存:{file_name}")
代码说明
- 使用
openpyxl加载Excel文件,直接读取工作表中的内嵌图片集合ws._images。 - 通过图片的
anchor属性获取其所在单元格的行号,关联到DataFrame中对应的行数据。 - 将图片的二进制数据转换为PIL Image对象,按指定规则命名并保存为JPG格式。
- 修正了列名匹配问题,直接使用表格实际列名
serial_number。
注意事项
- 确保Excel中的图片是内嵌在对应行的单元格中,而非浮动在任意位置,否则无法准确关联到行数据。
- 若存在多行共用一张图片或图片位置与数据行不匹配的情况,需根据实际场景调整图片与行的关联逻辑。
内容的提问来源于stack exchange,提问作者Md. Mojnu Miah
相关产品推荐
相关产品推荐

