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

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...

问题原因

  1. Pandas不支持读取内嵌图片:pd.read_excel()默认仅读取单元格的文本/数值数据,Excel内嵌的图片不会被解析到DataFrame中,对应photo列的单元格会被识别为NaN,触发代码中的跳过逻辑。
  2. 列名不匹配:代码中使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 05:37:45