温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python怎么读取excel中的图片功能

发布时间:2022-02-01 14:06:40 来源:亿速云 阅读:885 作者:iii 栏目:开发技术

这篇文章主要介绍“Python怎么读取excel中的图片功能”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python怎么读取excel中的图片功能”文章能帮助大家解决问题。

    一、读取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 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中的图片,但是有个缺点。就是我们不知道哪个图片来自哪个单元,在有些情况下知道图片来自哪个单元是很有比较的。下面我们就来解决这个问题:

    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.open(image.ref).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.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中的图片,就变成了读文件夹中的图片了,和普通文件一样,可以做各种处理。

    具体实现代码

     '''
     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中的图片功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI