并按某列重命名"/>
Python批量提取Excel中图片并按某列重命名
场景
客户发了一个物料列表,里面有物料编码、物料名称、图片等信息,有一万多行数据,希望我们能把图片导入到金蝶云星空的物料列表中。
实现
金蝶云星空是有导入图片的功能,尝试了一下可用。所以分以下步骤去实现批量导入。
1、从Excel中提取图片(本文实现)
为了第二步不一次性导入过多的物料,先对Excel分成多张表后再提取。
2、按云星空导入图片功能的Excel模板整理格式
from openpyxl import load_workbook
from openpyxl_image_loader import SheetImageLoaderpath = r'F:\导出图片\\' # Excel文件路径
saveDir = "F:\导出图片\\" # 图片存储路径wb = load_workbook(path + '你的文件名.xlsx') # Excel文件名
ws = wb['Sheet1'] #你的工作簿
image_loader = SheetImageLoader(ws)
num = ws.max_row # 总行数for i in range(2, num+1): # 从第2行开始,总行数要+1try:name = ws['E'+str(i)].value # 文件名所在的列image = image_loader.get('D'+str(i)) # 列的图片image.save(saveDir + name + ".jpg")# 排除没有图片,或图片超出单元格的情况except ValueError:print("这一行没有图片:" ,i)
报错,OSError: cannot write mode P as JPEG
我这里只要不是rgb就转成rgb。这样就能全部保存成.jpg格式,方便我后面整理。有些不能转换的就只能保存成.png格式。
改了一通没有报错了,但发现有几种情况不报错、也不保存图片:1、格式是JPEG格式存不下来先转换一下再保存。2、单元格里不是图片,是文字......(不知道客户咋想的,放个文字)
修改后代码如下:
from openpyxl import load_workbook
from openpyxl_image_loader import SheetImageLoaderpath = r'F:\导出图片\\' # Excel文件路径
saveDir = "F:\导出图片\\" # 图片存储路径wb = load_workbook(path + '1-200.xlsx') # Excel文件名
ws = wb['Sheet1'] #你的工作簿
image_loader = SheetImageLoader(ws)
num = ws.max_rowfor i in range(2, num+1): # 从第2行开始,总行数要+1try:name = ws['E'+str(i)].value # 文件名image = ws['D' + str(i)].value # 单元格内有文字if image != None:print("这一行是文字:" ,i)else:image = image_loader.get('D'+str(i)) # 列的图片gs=image.formatif gs =='PNG':image.save(saveDir + name + ".PNG")elif gs == 'JPEG': #图片是JPEG格式,先转换image.convert('RGB')image.save(saveDir + name + ".PNG")# 排除没有图片,或图片超出单元格的情况except ValueError:print("这一行没有图片:" ,i)
Excel表如下:
提取后的结果如下
一些可能导致异常的情况
1、可能图片超出单元格,导致读取不到
调整图片在单元格内
2、可能该单元格内没有图片或单元格内是文字
3、可能图片格式不符合,读取不到
更多推荐
Python批量提取Excel中图片并按某列重命名
发布评论