Python实现读取excel中的图⽚功能
⽬录
⼀、读取excel⽂件
⼆、读取excel中的图⽚
(1)使⽤zipfile模块
(2)使⽤openpyxl读取
三、对读取的图⽚进⾏处理
补充
⼀、读取excel⽂件
我们先来看看如何读取excel⽂件,读取excel⽂件的⽅式很多。这⾥选择openpyxl模块,安装语句如下:
pip install openpyxl
我们还需要⽤到⼀些其它模块,具体如下:
pip install pyzbar
pip install pillow
pip install numpy
下⾯我们就可以开始操作了。
在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)
⼆、读取excel中的图⽚
读取excel中的图⽚有多种⽅式,本⽂会分享两种⽅式。
(1)使⽤zipfile模块
excel本⾝是⼀个压缩⽂件,我们把excel的后缀改成zip后,⼿动解压就会看到在xl/media⽬录下有⼀些图⽚⽂件,这些图⽚就是excel种插⼊的图⽚。因此我们就可以通过解压的⽅式读取excel种的图⽚,具体代码如下:
import os
from zipfile import ZipFile
# 解压⽬录
unzip_path = "./unzip"
if not ists(unzip_path):
os.mkdir(unzip_path)
with ZipFile("111.xlsx") as f:
for file in f.namelist():
# 解压图⽚部分的⽂件
if file.startswith("xl/media"):
详细讲解可以参考
(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)
我们先读取了⼀个表,然后调⽤_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)
具体输⼊内容如下:
<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对图⽚进⾏各种操作。
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.f).convert("RGB")
# 将Pillow中的图⽚对象转换成ndarray数组
img = np.array(img)
如果我们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.f).convert("RGB")
img = np.array(img)
# 解析⼆维码
data = pyzbar.decode(img)
if data:
text = data[0].data.decode('utf-8')
print(text)
else:
print("未识别到内容")
补充
除了以上的⽅法,还可以通过以下操作实现:
1、将待读取的excel⽂件后缀名改成zip,变成压缩⽂件。
2、再解压这个⽂件。
3、在解压后的⽂件夹中,就有excel中的图⽚。
4、这样读excel中的图⽚,就变成了读⽂件夹中的图⽚了,和普通⽂件⼀样,可以做各种处理。
具体实现代码python怎么读入excel
'''
File Name: readexcelimg
Author: tim
Date: 2018/7/26 19:52
Description:读取excel中的图⽚,打印图⽚路径
先将excel转换成zip包,解压zip包,包下⾯有⽂件夹存放了图⽚,读取这个图⽚
'''
import os
import zipfile
# 判断是否是⽂件和判断⽂件是否存在
def isfile_exist(file_path):
if not os.path.isfile(file_path):
print("It's not a file or no such file exist ! %s" % file_path)
return False
else:
return True
# 修改指定⽬录下的⽂件类型名,将excel后缀名修改为.zip
def change_file_name(file_path, new_type='.zip'):
if not isfile_exist(file_path):
return ''
extend = os.path.splitext(file_path)[1] # 获取⽂件拓展名
if extend != '.xlsx' and extend != '.xls':
print("It's not a excel file! %s" % file_path)
return False
file_name = os.path.basename(file_path) # 获取⽂件名
new_name = str(file_name.split('.')[0]) + new_type # 新的⽂件名,命名为:xxx.zip
dir_path = os.path.dirname(file_path) # 获取⽂件所在⽬录
new_path = os.path.join(dir_path, new_name) # 新的⽂件路径
if ists(new_path):
return new_path # 返回新的⽂件路径,压缩包
# 解压⽂件
def unzip_file(zipfile_path):
if not isfile_exist(zipfile_path):
return False
if os.path.splitext(zipfile_path)[1] != '.zip':
print("It's not a zip file! %s" % zipfile_path)
return False
file_zip = zipfile.ZipFile(zipfile_path, 'r')
file_name = os.path.basename(zipfile_path) # 获取⽂件名
zipdir = os.path.join(os.path.dirname(zipfile_path), str(file_name.split('.')[0])) # 获取⽂件所在⽬录
for files in file_zip.namelist():
act(files, os.path.join(zipfile_path, zipdir)) # 解压到指定⽂件⽬录
file_zip.close()
return True
# 读取解压后的⽂件夹,打印图⽚路径
def read_img(zipfile_path):
if not isfile_exist(zipfile_path):
return False
dir_path = os.path.dirname(zipfile_path) # 获取⽂件所在⽬录
file_name = os.path.basename(zipfile_path) # 获取⽂件名
pic_dir = 'xl' + os.sep + 'media' # excel变成压缩包后,再解压,图⽚在media⽬录
pic_path = os.path.join(dir_path, str(file_name.split('.')[0]), pic_dir)
file_list = os.listdir(pic_path)
for file in file_list:
filepath = os.path.join(pic_path, file)
print(filepath)
# 组合各个函数
def compenent(excel_file_path):
zip_file_path = change_file_name(excel_file_path)
if zip_file_path != '':
if unzip_file(zip_file_path):
read_img(zip_file_path)
# main
if __name__ == '__main__':
compenent('/Users/Desktop/test/people.xlsx')
到此这篇关于Python实现读取excel中的图⽚功能的⽂章就介绍到这了,更多相关Python读取excel图⽚内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论