Python提取excel中的图片

一、代码目标

提取excel中所有图片,并以对应行指定列的值+图片错在列表头的值作为图片的名称,最后保存图片到文件夹。

二、注意事项

  • excel中的图片必须是悬浮图片,不能是wps特有的DISPIMG格式。
  • 单元格中如果存在多张图片,此方法只保留一张(因为图片名称相同,如果全部都想保留)

三、文件处理

(一)DISPIMG转为悬浮图片

WPS打开文件,批量选择DISPIMG格式的图片(第一个选择的图片必须是DISPIMG格式),右键选择转为浮动图片

(二)悬浮图片转为DISPIMG

方案一:选择悬浮图片,右键选择图片嵌入单元格

方案二:①打开右侧选择窗格;②选择任意一张图片对象(DISPIMG不会出现在这里);③Ctrl+A选中所有悬浮图片对象;④鼠标悬浮在任意悬浮图片上方,右键选择图片嵌入单元格。

四、核心代码

#目标:提取excel中所有图片,并以对应行指定列的值+图片错在列表头的值作为图片的名称,最后保存图片
##############引入必要的库#################
import os
import pandas as pd
from openpyxl import load_workbook
from PIL import Image
import io

###############定义函数#######################
def extract_images_from_excel(excel_file, name_column, sheet_name):
    #print(sheet_name)
    # 创建保存目录
    desktop_path = os.path.join(os.path.expanduser("~"), "Desktop")
    save_dir = os.path.join(desktop_path, "jupyter", "img","06")
    os.makedirs(save_dir, exist_ok=True)
    
    # 加载工作簿
    wb = load_workbook(excel_file)
    
    # 选择工作表
    if sheet_name:
        ws = wb[sheet_name]
    else:
        ws = wb.active
    
    # 读取数据(用于获取图片名称)
    df = pd.read_excel(excel_file, sheet_name=sheet_name)
    
    # 处理列参数(支持列字母或索引)
    if isinstance(name_column, str):
        # 如果是字母,转换为列索引
        col_idx = ord(name_column.upper()) - 64  # A=1, B=2, ...
    else:
        col_idx = name_column
    
    # 提取图片
    for img in ws._images:
        #print(str(img.anchor._from.row)+"---"+str(img.anchor._from.col))
        #获取订单号
        myorder =ws.cell(row=img.anchor._from.row+1, column=name_column).value
        #print(myorder)

        image_name = myorder+"_"+ws.cell(row=1, column=img.anchor._from.col+1).value

        # 清理文件名(移除非法字符)
        image_name = "".join(c for c in image_name if c.isalnum() or c in (' ', '-', '_')).rstrip()
        
        # 获取图片数据
        img_data = img._data()
        
        # 保存图片
        try:
            image = Image.open(io.BytesIO(img_data))
            file_path = os.path.join(save_dir, f"{image_name}.png")
            image.save(file_path)
            print(f"已保存: {file_path}")
        except Exception as e:
            print(f"保存图片失败 (行 {row}): {e}")
    print(f"\n所有图片已保存到: {save_dir}")


#############调用函数##################
# 使用示例:使用5列作为图片名称.不传sheet_name,默认使用第一个sheet
extract_images_from_excel("C:/Users/酱紫/Desktop/jupyter/资料/6月国补2条资料.xlsx", name_column=5,sheet_name="Sheet1") 

五、扩展代码

如果同一个单元格存在多张图片,且多张图片都需要保存的时候,可以进行如下拓展

# 处理重名文件---放在获取图片数据之后
base_name = image_name
counter = 1
file_path = os.path.join(save_dir, f"{base_name}.png")
while os.path.exists(file_path):
    file_path = os.path.join(save_dir, f"{base_name}_{counter}.png")
    counter += 1
#在保存图片片段:删除file_path = os.path.join(save_dir, f"{image_name}.png")行



发布时间:2025年11月19日 16:39
分类:技术博客
标签: 其他
作者:五行缺土
微信扫码接收最新分享: