Python读取excel中的图片
Python读取excel中的图片
一、读取excel文件
我们先来看看如何读取excel文件,读取excel文件的方式很多。这里选择openpyxl模块,安装语句如下:
pip install openpyxl
- 1
我们还需要用到一些其它模块,具体如下:
pip install pyzbar
pip install pillow
pip install numpy
- 1
- 2
- 3
下面我们就可以开始操作了。
在Excel中,有工作簿、表、单元等。这里简单说一下,工作簿就是一个excel文件,表的话就是我们excel左下角切换的sheet1、sheet2,单元就是一个格子。下面我们来读取一个excel文件:
from openpyxl import load_workbook
# 加载excel
wb = load_workbook("111.xlsx")
# 切换到第一张表
ws = wb[wb.sheetnames[0]]
# 获取A3单元
cell = ws['A3']
# 输出A3单元的值
print(cell.value)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
openpyxl的更多操作可以看看官方的文档https://openpyxl.readthedocs.io/en/stable/tutorial.html。
二、读取excel中的图片
读取excel中的图片有多种方式,本文会分享两种方式。
(1)使用zipfile模块
excel本身是一个压缩文件,我们把excel的后缀改成zip后,手动解压就会看到在xl/media目录下有一些图片文件,这些图片就是excel种插入的图片。因此我们就可以通过解压的方式读取excel种的图片,具体代码如下:
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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
详细讲解可以参考https://blog.csdn.net/ZackSock/article/details/120539753。
(2)使用openpyxl读取
上面的操作可以获取excel中的图片,但是有个缺点。就是我们不知道哪个图片来自哪个单元,在有些情况下知道图片来自哪个单元是很有比较的。下面我们就来解决这个问题:
from openpyxl import load_workbook
wb = load_workbook("111.xlsx")
ws = wb[wb.sheetnames[0]]
# 遍历表中所有托
for image in ws._images:
print(image)
- 1
- 2
- 3
- 4
- 5
- 6
我们先读取了一个表,然后调用_images获取表中的所有图片。但是这个图片我们还不能操作,具体对图片的操作我们下一节再看。我们先看看怎么知道图片来自哪个单元,我们可以输出图片的anchor._from:
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
- 4
- 5
- 6
具体输入内容如下:
<openpyxl.drawing.spreadsheet_drawing.AnchorMarker object>
Parameters:
col=0, colOff=1, row=0, rowOff=1
- 1
- 2
- 3
其中col表示行号,row表示列号。根据这些信息,我们就可以知道图片的单元了。比如col=0,row=0,表示的应该是A1单元。如果col=1,row=1,表示的应该是B2单元。
三、对读取的图片进行处理
对图片处理的操作有很多,这里要看具体需要。这里我分享一下把excel中图片转换成pillow图片和ndarray对象的操作。转换后,我们就可以用numpy和pillow对图片进行各种操作。
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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如果我们excel中的图片是二维码,我们就可以进行下面的操作:
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("未识别到内容")
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
今天的内容就到这里,感兴趣的读者可以关注“新建文件夹X”。
文章来源: zacksock.blog.csdn.net,作者:ZackSock,版权归原作者所有,如需转载,请联系作者。
原文链接:zacksock.blog.csdn.net/article/details/122222765
- 点赞
- 收藏
- 关注作者
评论(0)