python读取excel中的图片
读取excel中的图片有多种方式,本文会分享两种方式。
(1)使用zipfile模块
excel本身是一个压缩文件,我们把excel的后缀改成zip后,手动解压就会看到在xl/media目录下有一些图片文件,这些图片就是excel种插入的图片。因此我们就可以通过解压的方式读取excel种的图片,具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 | import os from zipfile import ZipFile # 解压目录 unzip_path = "./unzip" if not os.path.exists(unzip_path): os.mkdir(unzip_path) with ZipFile( "111.xlsx" ) as f: for file in f.namelist(): # 解压图片部分的文件 if file .startswith( "xl/media" ): f.extract( file , path = unzip_path) |
2)使用openpyxl读取
上面的操作可以获取excel中的图片,但是有个缺点。就是我们不知道哪个图片来自哪个单元,在有些情况下知道图片来自哪个单元是很有比较的。下面我们就来解决这个问题:
1 2 3 4 5 6 | from openpyxl import load_workbook wb = load_workbook( "111.xlsx" ) ws = wb[wb.sheetnames[ 0 ]] # 遍历表中所有托 for image in ws._images: print (image) |
我们先读取了一个表,然后调用_images获取表中的所有图片。但是这个图片我们还不能操作,具体对图片的操作我们下一节再看。我们先看看怎么知道图片来自哪个单元,我们可以输出图片的anchor._from:
1 2 3 4 5 6 | from openpyxl import load_workbook wb = load_workbook( "111.xlsx" ) ws = wb[wb.sheetnames[ 0 ]] for image in ws._images: # 输出图片的位置信息 print (image.anchor._from) |
具体输入内容如下:
1 2 3 | <openpyxl.drawing.spreadsheet_drawing.AnchorMarker object > Parameters: col = 0 , colOff = 1 , row = 0 , rowOff = 1 |
其中col表示行号,row表示列号。根据这些信息,我们就可以知道图片的单元了。比如col=0,row=0,表示的应该是A1单元。如果col=1,row=1,表示的应该是B2单元。
三、对读取的图片进行处理
对图片处理的操作有很多,这里要看具体需要。这里我分享一下把excel中图片转换成pillow图片和ndarray对象的操作。转换后,我们就可以用numpy和pillow对图片进行各种操作。
1 2 3 4 5 6 7 8 9 10 | import numpy as np from PIL import Image from openpyxl import load_workbook wb = load_workbook( "111.xlsx" ) ws = wb[wb.sheetnames[ 0 ]] for image in ws._images: # 将图片转换成Pillow中的图片对象 img = Image. open (image.ref).convert( "RGB" ) # 将Pillow中的图片对象转换成ndarray数组 img = np.array(img) |
如果我们excel中的图片是二维码,我们就可以进行下面的操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import numpy as np from PIL import Image from pyzbar import pyzbar from openpyxl import load_workbook wb = load_workbook( "111.xlsx" ) ws = wb[wb.sheetnames[ 0 ]] for image in ws._images: # 转换成容易操作的图片对象 img = Image. open (image.ref).convert( "RGB" ) img = np.array(img) # 解析二维码 data = pyzbar.decode(img) if data: text = data[ 0 ].data.decode( 'utf-8' ) print (text) else : print ( "未识别到内容" ) |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2017-03-31 selenium 加载jquery
2017-03-31 获取html元素的XPath路径
2015-03-31 Test Double