脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python实现读取excel中的图片功能

Python实现读取excel中的图片功能

2022-09-07 09:41ZackSock Python

这篇文章主要介绍了如何利用Python实现读取Excel中的图片的功能,文中的实现步骤讲解详细,对我们学习Python有一定帮助,需要的可以参考一下

一、读取excel文件

我们先来看看如何读取excel文件,读取excel文件的方式很多。这里选择openpyxl模块,安装语句如下:

?
1
pip install openpyxl

我们还需要用到一些其它模块,具体如下:

?
1
2
3
pip install pyzbar
pip install pillow
pip install numpy

下面我们就可以开始操作了。

在Excel中,有工作簿、表、单元等。这里简单说一下,工作簿就是一个excel文件,表的话就是我们excel左下角切换的sheet1、sheet2,单元就是一个格子。下面我们来读取一个excel文件:

?
1
2
3
4
5
6
7
8
9
from openpyxl import load_workbook
# 加载excel
wb = load_workbook("111.xlsx")
# 切换到第一张表
ws = wb[wb.sheetnames[0]]
# 获取A3单元
cell = ws['A3']
# 输出A3单元的值
print(cell.value)

openpyxl的更多操作可以看看官方的文档https://openpyxl.readthedocs.io/en/stable/tutorial.html。

二、读取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("未识别到内容")

补充

除了以上的方法,还可以通过以下操作实现:

1、将待读取的excel文件后缀名改成zip,变成压缩文件。

2、再解压这个文件。

3、在解压后的文件夹中,就有excel中的图片。

4、这样读excel中的图片,就变成了读文件夹中的图片了,和普通文件一样,可以做各种处理。

具体实现代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
'''
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 os.path.exists(new_path):
    os.remove(new_path)
  os.rename(file_path, 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():
    file_zip.extract(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图片内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/ZackSock/article/details/122222765

延伸 · 阅读

精彩推荐
  • Pythonpython global的创建和修改实例讲解

    python global的创建和修改实例讲解

    在本篇文章里小编给大家整理了一篇关于python global的创建和修改实例讲解内容,有兴趣的朋友们可以学习下。...

    小妮浅浅8012022-01-05
  • Pythonpython绘图之坐标轴的超详细讲解

    python绘图之坐标轴的超详细讲解

    在使用matplotlib模块时画坐标图时,往往需要对坐标轴设置很多参数,这些参数包括横纵坐标轴范围、坐标轴刻度大小、坐标轴名称等,下面这篇文章主要给大家...

    大风起兮_8962022-08-30
  • Python解决Python访问MySQL数据库速度慢的问题

    解决Python访问MySQL数据库速度慢的问题

    这篇文章主要介绍了解决Python访问MySQL数据库速度慢的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    余生羁绊6792021-10-07
  • PythonPython的collections模块真的很好用

    Python的collections模块真的很好用

    collections是实现了特定目标的容器,以提供Python标准内建容器 dict , list , set , 和 tuple 的替代选择,本文详细总结collections的相关知识,感兴趣的朋友跟随看...

    运维派11322021-09-12
  • Python利用Python第三方库xlwt写入数据到Excel工作表实例代码

    利用Python第三方库xlwt写入数据到Excel工作表实例代码

    大家应该都知道xlwt是python中写入到excel的库,下面这篇文章主要给大家介绍了关于利用Python第三方库xlwt写入数据到Excel工作表的相关资料,文中通过实例代码...

    华仔仔coding8232022-07-22
  • Pythonpython中的None与NULL用法说明

    python中的None与NULL用法说明

    这篇文章主要介绍了python中的None与NULL用法说明,具有很好的参考价值,希望大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教 ...

    小小的刀8752021-11-12
  • Python浅谈python数据类型及其操作

    浅谈python数据类型及其操作

    今天带大家了解python数据类型的相关知识,文中介绍的非常详细,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下...

    极客阿宝7482021-11-12
  • Python在Python中使用全局日志时需要注意的问题

    在Python中使用全局日志时需要注意的问题

    这篇文章主要介绍了在Python中使用全局日志时需要注意的问题, 作者由uliweb使用时遇到的问题分析全局日志出现错误时的解决方法,需要的朋友可以参考下...

    脚本之家3152020-06-23