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
分类:技术博客
标签:
其他
作者:五行缺土
微信扫码接收最新分享: