Python读取Excel中的图片(二)

您所在的位置:网站首页 xlsx提取电话号码 Python读取Excel中的图片(二)

Python读取Excel中的图片(二)

2023-07-08 10:30| 来源: 网络整理| 查看: 265

继上一篇 使用Python读取Excel中的图片并对应到记录 ,经过实践之后,又发现了问题,便有了今天这篇。

1、经过实践后发现的问题

代码经过实践后,发现还是有问题,有些图片还是对应不到相应的记录,于是又开始了一波debugger,发现不是代码的锅,而是Excel解压后drawing1.xml的锅,来看看我们解析xml的代码:

def _f(subElementObj): for anchor in subElementObj: xdr_from = anchor.getElementsByTagName('xdr:from')[0] col = xdr_from.childNodes[0].firstChild.data # 获取标签间的数据 row = xdr_from.childNodes[2].firstChild.data embed = anchor.getElementsByTagName('xdr:pic')[0].getElementsByTagName('xdr:blipFill')[0].getElementsByTagName('a:blip')[0].getAttribute('r:embed') # 获取属性 image_info[(int(row), int(col))] = img_dict.get(int(embed.replace('rId', '')), {}).get(img_feature)

要解析的xml文档部分内容:

... ...

获取到元素的r:embed属性,即对应团片的序号,实际上,如果Excel内容是从其他地方复制过来的,他的序号与图片的序号对应不上,导致的问题,遗憾的是没找到什么原因,不知道Excel中是如何对应的,有兴趣的同学可以研究下。

2、另一种方式的实现

另一种方式是使用openpyxl和openpyxl_image_loader库,按行读取,loader 图片进行保存,完整代码见:new_read_data.py。

3、新增的需求

循环读取在某个目录下的多个文件))

for root, dirs, files in os.walk(source_root): for file in files: print(os.path.join(root, file))

leader 要求照片大于200K不入库,于是添加了压缩图片的功能,我将压缩图片的代码分离了出来compress_image.py。

将有问题的数据记录下来,写入 Excel,于是有了写入Excel的代码。

wb = Workbook() ws = wb.create_sheet("存在问题的数据", 0) index = 1 for i in range(len(error_data)): index = index + 1 arr_list = error_data[i].split("|") for j in range(len(arr_list)): ws.cell(row = index, column= j+1, value = arr_list[j]) wb.save(target_root + '存在问题的数据.xlsx')

照片使用电话号码命名,并生成日志,写入文件。

4、存在的问题

由于原始数据中存在照片未采集的记录,但是提取到的数据中这些记录都有对应的照片,原来image_loader = SheetImageLoader(ws)每次读完不会清空字典,所以就会把上一个文件中对应行的照片读取到当前文件的这一行,经过搜索查找发现是openpyxl-image-loader的问题,相关issues地址:images should not be static variable of SheetImageLoader 。所以在每次循环结束将image_loader 清空即可,添加这行代码:

image_loader._images.clear() 5、通过VB导出图片

其实提取Excel中的图片可以使用VB实现,直接在Excel的sheet上右键【查看代码】然后粘贴一下代码执行就会将图片导出来,并且能以任一列的值命名。

Sub 导出图片() On Error Resume Next MkDir ThisWorkbook.Path & "\图片" For Each pic In ActiveSheet.Shapes If pic.Type = 13 Then RN = pic.TopLeftCell.Offset(0, -3).Value pic.Copy With ActiveSheet.ChartObjects.Add(0, 0, pic.Width, pic.Height).Chart '创建图片 .Parent.Select .Paste .Export ThisWorkbook.Path & "\图片\" & RN & ".jpg" .Parent.Delete End With End If Next MsgBox "导出图片完成! " End Sub 6、总结

经过不断的折腾,发现条条大路通罗马才是真理,不管你用什么方式实现,发现问题、解决问题才是最重要的经历。

治恒说说

更多文章请关注微信公众号: 治恒说说



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3