精华内容
下载资源
问答
  • 大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进行分析...Python读取Excel图片 Python写入Excel图片 涉及的Pyt

    大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进行分析。

    那么你知道如何使用Python读取Excel中的图片?又如何使用Python直接往Excel中写入图片?甚至使用Python制作一个Excel可视化大屏?

    因为图片的存储格式与数字数据格式不一样,所以实现起来稍显复杂,本文就将对以下两个部分进行深入讲解:

    • Python读取Excel图片
    • Python写入Excel图片

    涉及的Python模块有以下几个

    • PIL
    • win32
    • os
    • zipfile
    • numpy
    • xlsxwriter

      一、准备

    由于此次包比较多,我们需要在命令行中使用pip进行安装

    pip install pillow   #这是对模块PTL的安装
    pip install pypiwin32    #这是对win32的安装
    pip install os 
    pip install zipfile
    pip install numpy
    pip install xlsxwriter

    在下载的过程中,有些包是比较大的,会出现超时time out的报错现象。这里介绍几个国内的镜像,大家可以尝试其中一个,速度会比单纯的pip快10倍不止。地址如下:

    http://pypi.douban.com/simple/ 豆瓣
    http://mirrors.aliyun.com/pypi/simple/ 阿里
    http://pypi.hustunique.com/simple/ 华中理工大学
    http://pypi.sdutlinux.org/simple/ 山东理工大学
    http://pypi.mirrors.ustc.edu.cn/simple/ 中国科学技术大学
    https://pypi.tuna.tsinghua.edu.cn/simple 清华

    代码如下:

    pip install 模块名 -i 网址

    清华镜像举例

    pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple

    注意:如果是原生态的cmd窗口安装的,会提示加个--user命令,读者按照指示即可。

      二、Python读取Excel图片

    上面说过,Python读取Excel图片有两种方法

    第一种:将xlsx后缀名改为zip形式,即进行压缩。而后读取里面存储图片的文件,将里面的图片取出来。

    第二种:用提取到粘贴板中的方法将图片保存到JPG、PNG等格式中

    两种方法各有缺点和优点,第一种方法缺点是代码量比较长,优点是万能,Excel的所有格式都可以运用。

    第二种的优点是代码量少,缺点是对于一些xlsx的文件运用不了

    首先我们先讲解第一种方法,之后在讲解第二种方法时,大家可以进行对比!

    讲解之前我们用的是以下的example.xlsx文件,里面有四个工作表,每个工作表都有一张数据可视化图。例如工作表3中的气泡图如下:

    2.1  方法一

    和之前的文章一样,我们先给出全部代码与效果图之后再进行讲解

    import os
    import zipfile
    import os
    from PIL import Image
    import numpy as np 
    path = r'D:'
    count = 1
    for file in os.listdir(path):
        new_file = file.replace(".xlsx",".zip")
        os.rename(os.path.join(path,file),os.path.join(path,new_file))
        count+=1
    print('总共有'+str(count)+'个文件夹')
    number = 0
    craterDir = "D:/"  # 存放zip文件的文件夹路径
    saveDir = "D:/"  # 存放图片的路径 
    list_dir = os.listdir(craterDir) 
    for i in range(len(list_dir)):
        if 'zip' not in list_dir[i]:
            list_dir[i] = ''
    while '' in list_dir:
        list_dir.remove('')    
    for zip_name in list_dir:
        print(zip_name)
        azip = zipfile.ZipFile(craterDir + zip_name)
        namelist = (azip.namelist())
     
        for idx in range(0,len(namelist)):
            if namelist[idx][:9] == 'xl/media/':#图片是在这个路径下
                img_name = saveDir + str(number)+'.jpg'
                f = azip.open(namelist[idx])
                img = Image.open(f)
                img = img.convert("RGB")
                img.save(img_name,"JPEG")
                number += 1
    azip.close()  #关闭文件,必须有,释放内存
    

    效果展现如下:

    可以看到example.xlsx里面的四张工作表里的图片都提取出来,保存在本地。

    现在我们进行代码解析,首先,引入相关包

    import os
    import zipfile
    from PIL import Image
    import numpy as np 
    

    其次,就是将xlsx格式结尾的文件夹进行压缩,转化成zip结尾的文件

    path = r'D:'   #excel文件位置
    count = 1
    for file in os.listdir(path):
        new_file = file.replace(".xlsx",".zip")
        os.rename(os.path.join(path,file),os.path.join(path,new_file))
        count+=1 
    

    这里首先设置了example.xlsx的文件位置,在D盘的根目录,读者需要做调整的话在path那行代码修改即可。

    其次用os模块的listdir函数用于返回指定的文件夹包含的文件或文件夹的名字的列表。再用for循环遍历这个列表,将.xlsx结尾的改为.zip结尾。

    同时再用os.rename()函数重命名对应的文件夹。count是用来告诉用户这个文件夹有多少个文件的,用于检验。

    最后,就是在这些压缩过后的文件中,提取图片。代码如下

    number = 0
    craterDir = "D:/"  # 存放zip文件的文件夹路径
    saveDir = "D:/"  # 存放图片的路径 
    list_dir = os.listdir(craterDir) # 获取所有的文件名
    
    for i in range(len(list_dir)):
        if 'zip' not in list_dir[i]:
            list_dir[i] = ''
    while '' in list_dir:
        list_dir.remove('')   
    

    下面是代码解析

    首先,number=0是用来最后命名图片的。craterDir是指存放zip的文件夹路径,saveDir指存放提取后的图片的指定路径。用os.listdir()函数来获取在这个路径下的所有文件名字。

    这里强调下,本章代码采用的路径,除了上面讲过的path外,其他都用绝对路径,因为如os模块和zipfile模块,这些模块用绝对路径更不会报错。

    下面用一个for循环加个while循环的用途是剔除不是.zip结尾的文件夹。这时有读者会问,用for循环加个列表del函数不香吗

    其实是不行的,大家可以去尝试一下。原因是,你每次del广域网一个列表的元素,列表的数量值会一直在变而不是固定的,这样就会导致超出索引的错误。

    for zip_name in list_dir:
        print(zip_name)
        # 默认模式r,读
        azip = zipfile.ZipFile(craterDir + zip_name)
        # 返回所有文件夹和文件
        namelist = (azip.namelist())
     
        for idx in range(0,len(namelist)):
            if namelist[idx][:9] == 'xl/media/':#图片是在这个路径下
                img_name = saveDir + str(number)+'.jpg'
                f = azip.open(namelist[idx])
                img = Image.open(f)
                img = img.convert("RGB")
                img.save(img_name,"JPEG")
                number += 1
    azip.close()  #关闭文件,必须有,释放内存
    

    最后就是读取zip文件中的图片。用for循环遍历我们已经处理过的list——dir列表,得到zip文件名,再用zipfile.ZipFile()函数来打开我们zip文件。其中azip.namelist()函数是用来装zip文件里面所有文件的文件名列表。

    接下来可以进入到zip文件中仔细观察,可以发现我们所需要的图片在'xl/media/'这个路径下,有了这个目标后,我们再用for循环遍历zip文件里的所有文件,找到路径下的图片。

    第二个for循环需要注意几点

    azip.open()是zipfile模块里的打开命令。相对应的,就有azip.close()这个命令,这个命令再整个程序运行完后必须运训,因为不仅可以清理所占空间,而且如果你需要还原xlsx文件格式的话,你就必须得关闭,不然会报错。

    Image.open()是模块Pillow模块的读取图片函数,也算是我们本章最重要的函数之一了,与其搭配的是Image.save()函数,是用来存储的。中间插着一段代码img.convert("RGB"),这个一般都是要用到的,我们存储的图片大多数是有色的,也就是RGB图像,如果是黑白的话就要调一下参数。有兴趣的读者可以自行查阅文献。

    2.2  方法二

    接下来讲解第二种方法,先上代码

    from PIL import ImageGrab
    import win32com.client as win32
    
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    workbook = excel.Workbooks.Open(r'D:\example.xlsx')
    
    num = 1
    for sheet in workbook.Worksheets:
        for i, shape in enumerate(sheet.Shapes):
            if shape.Name.startswith('Picture'):
                shape.Copy()
                image = ImageGrab.grabclipboard()   
                image.convert('RGB').save(r'D:\{}.jpg'.format(num), 'jpeg')
                num+=1
    excel.Quit()
    

    效果呈现:

    从上图可以看到,与方法一的效果相比,基本一致,除了没有进行压缩,下面简单说一下代码

    from PIL import ImageGrab
    import win32com.client as win32
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    workbook = excel.Workbooks.Open(r'D:\example.xlsx')
    

    首先先引入方法二相关的模块,第三行代码是引入模块win32中对Excel中的运用程序。第四行和方法一一样是读取D盘根目录下的example.xlsx文件。

    num = 1
    for sheet in workbook.Worksheets:
        for i, shape in enumerate(sheet.Shapes):
            if shape.Name.startswith('Picture'):
                shape.Copy()
                image = ImageGrab.grabclipboard()   
                image.convert('RGB').save(r'D:\{}.jpg'.format(num), 'jpeg')
                num+=1
    excel.Quit()
    

    第一行num=1,是用来为下面存储图片的图片命名的

    接下来就是进行for嵌套for,第一个for循环的目的是遍历所选Excel文件中的工作表,我们有四张图片放在example.xlsx的四个不同的工作表里。第二个for循环是用来遍历每个工作表中的图片并复制到粘贴板中的。

    其中,enumerate()函数是用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。这里的意思就是存放每张图片数据信息的索引。i是数据下标,shape是数据

    shape.Name.startswith('Picture')是判断获到的shape里面名字信息中的开头是否符合'pitcure',如果是,则返回True。

    shape.Copy()函数是对一个一个字典的浅复制(拷贝)。简单来说就是只在程序中的复制。

    ImageGrab.grabclipboard()函数是方法二的精髓,这个函数是抓取当前剪贴板的快照,返回一个模式为“RGB”的图像或者文件名称的列表。如果剪贴板不包括图像数据,这个函数返回空。读者可以使用函数isinstance()来检查该函数返回的是一个有效图像对象或者其他数据。

    image.convert('RGB').save(r'D:\{}.jpg'.format(num), 'jpeg')这段语句,是将得到的image以jpg的格式存储。这里的jpeg其实就是jpg,只不过模块里以jpeg代替jpg。

    注意,这里必须用convert('RGB'),如果不使用.convert('RGB')进行转换的话,读出来的图像是RGBA四通道的,A通道为透明通道,运出来是没有图像显示的。因此使用convert('RGB')进行通道转换。

    至此,我们就讲完了使用Python提取Excel中图片的两种方法,大家可以根据自己的情况来选择如恶化提取Excel中的图片。

      二、Python写入Excel图片

    在讲完如何用Python提取Excel中图片之后,下面我们将讲解如何用Python将图片写入到Excel文件中。

    我们常用的模块是xlsxwriter。这里先介绍这个模块的常用插入图片函数

    worksheet.insert_image(row,col,image[,options] :在工作表单元格中插入一张图片

    参数介绍如下:

    row(int) - 单元格所在的行(从0开始)

    col(int) - 单元格所在的列(从0开始)

    image(string) - 图片文件名(含路径)

    options(dict) - 可选的图片位置,缩放,url参数

    同时insert_image()方法接受字典形式的可选参数来定位和缩放图片。默认值为

    {
        'x_offset': 0,    #以像素为单位,可以大于每个单元格的宽度和高度
        'y_offset': 0,
        'x_scale': 1,
        'y_scale': 1,
        'url': None,
        'tip': None,
        'image_data': None,
        'positioning': None,
    }

    上面几个参数主要作用如下:

    x_scale和y_scale参数可以用于水平及垂直的缩放图片。

    url参数可以为图片添加超链接/url, tip 参数为含有超链接的图片提供可选的鼠标悬停时的提示信息

    image_data参数用于在io.BytesIO中添加内存中的字节流,一般不用

    positioning参数可以用来控制图片对象的位置

    接下来会做一个简单的程序来演示:

    这里用一份数据简单的画出一个折线图,数据是一份广汇汽车的股票数据,从8月底到10月底的数据。以收盘价和时间画一个简单的折线图.

    代码如下:

    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.style as psl
    import xlsxwriter
    fig = plt.figure()
    df = pd.read_excel(r'D:\数据.xlsx')
    title = ['日期','收盘价']
    df = df[title]
    plt.plot(df['日期'],df['收盘价'])
    plt.gcf().autofmt_xdate()#自动调整角度
    plt.savefig(r'D:\数据折线图.jpg')
    

    Python画出的图如下:

    现在我们要将其插入到一份名为数据image.xlsx的excel文件中,来看看代码怎么写👇

    首先使用xlswriter创建一个新Excel文件并添加一个工作表

    
    workbook = xlsxwriter.Workbook(r'D:\数据images.xlsx')
    worksheet = workbook.add_worksheet()
    

    下面使用.insert_image插入图片。

    worksheet.write('A2', '插入第一张图片:')
    worksheet.insert_image('B2', r'D:\数据折线图.jpg')
    
    worksheet.write('A12', '插入第二张即位偏移图片:')
    worksheet.insert_image('B12', r'D:\数据折线图.jpg', {'x_offset': 15, 'y_offset': 10})
    
    
    # 插入一张缩放了的图片。
    worksheet.write('A23', '插入第三张缩放了的图片:')
    worksheet.insert_image('B23', r'D:\数据折线图.jpg', {'x_scale': 0.5, 'y_scale': 0.5})
    
    workbook.close()
    

    最后要注意一定要用workbook.close()才能生成,效果呈现如下

    可以看到,我们使用Matplotlib生成的折线图被插入到我们预定的指定位置中!

    至此,本文就结束了,相信你已经学会如何使用Python与Excel图片之间的交互,并能够结合具体的需求进行批量操作

    在这里还是要推荐下我自己建的Python开发学习群:1156465813,群里都是学Python开发的,如果你正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2020最新的Python进阶资料和高级开发教程,欢迎进阶中和进想深入Python的小伙伴!

    展开全文
  • python读取excel下载图片 #!/usr/bin/python # encoding: utf-8 from __future__ import print_function import os import pandas as pd import requests import numpy as np import _thread headers = { '...

    python读取excel下载图片

    #!/usr/bin/python
    # encoding: utf-8
    
    from __future__ import print_function
    
    import os
    
    import pandas as pd
    import requests
    import numpy as np
    
    import _thread
    
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
        }
    
    def downloadImg(parent_path,imgpath, headers):
        baseUrl1 = u'http://图片域名地址1'
        baseUrl2 = u'http://图片域名地址2'
        imgurl = imgpath
        imgname = imgpath.split('/')[-1]
        if not os.path.exists(parent_path):
            os.makedirs(parent_path)
        imglocalpath = os.path.join(parent_path, imgname)
        img = requests.get(baseUrl1+imgurl, headers)
        if img.status_code == 404:
            img = requests.get(baseUrl2 + imgurl, headers)
            if img.status_code == 404:
                return "error"
        with open(imglocalpath, 'wb') as f:
            f.write(img.content)
        return imglocalpath
    
    # 读取excel数据
    data = None
    def readXls():
        io = r'D:/Python/pythonwork1/test1/docTest/dy.xlsx'
        data = pd.read_excel(io.replace('\xe2\x80\xaa',''), sheet_name='Sheet1',skiprows=0,keep_default_na=False)
        return data
    
    if __name__ == '__main__':
        data = readXls()
        data1 = pd.DataFrame(columns = data.columns)
        for i in data.index:
            imgpath =data.loc[i]
            parent_path = os.path.join("D:/Python/pythonwork1/test1/docTest/ht",data.loc[i].car_business_id,data.loc[i].doc_name)
            if downloadImg(parent_path,data.loc[i].url,headers) == "error":
                # 写入读取不到的信息
                data1 = data1.append(data.loc[i])
        # 写如读取不到的信息
        io1 = r'D:/Python/pythonwork1/test1/docTest/dy404.xlsx'
        data1.to_excel(io1,"not_found")
    

     

    展开全文
  • excel中有图片是很常见的,但是通过python读取excel中的图片没有很好的解决办法。网上找了一种很聪明的方法,原理是这样的:1、将待读取的excel文件后缀名改成zip,变成压缩文件。2、再解压这个文件。3、在解压后的...

    excel中有图片是很常见的,但是通过python读取excel中的图片没有很好的解决办法。

    网上找了一种很聪明的方法,原理是这样的:

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

    2、再解压这个文件。

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

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

    解压后的压缩包如下:

    2018727100942032.png?201862710958

    python脚本如下:

    '''

    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中的图片完美解决方法

    本文地址: http://www.cppcns.com/jiaoben/python/235730.html

    展开全文
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。...那么你知道如何使用Python读取Excel中的图片?又如何使用Python直接往Excel中写入图

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

    PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

    python免费学习资料、代码以及交流解答点击即可加入


    大家好,在使用Python进行办公自动化操作时,一定少不了与Excel表格的交互,我们通常是用pandas处理表格数据,但大多数情况下,都是读取表格中的数值进行分析。

    那么你知道如何使用Python读取Excel中的图片?又如何使用Python直接往Excel中写入图片?甚至使用Python制作一个Excel可视化大屏?

    因为图片的存储格式与数字数据格式不一样,所以实现起来稍显复杂,本文就将对以下两个部分进行深入讲解:

    • Python读取Excel图片
    • Python写入Excel图片

       

       

      涉及的Python模块有以下几个

    • PIL
    • win32
    • os
    • zipfile
    • numpy
    • xlsxwriter

    一、准备

    由于此次包比较多,我们需要在命令行中使用pip进行安装

    pip install pillow   #这是对模块PTL的安装
    pip install pypiwin32    #这是对win32的安装
    pip install os 
    pip install zipfile
    pip install numpy
    pip install xlsxwriter
    

    在下载的过程中,有些包是比较大的,会出现超时time out的报错现象。这里介绍几个国内的镜像,大家可以尝试其中一个,速度会比单纯的pip快10倍不止。地址如下:

    http://pypi.douban.com/simple/ 豆瓣
    http://mirrors.aliyun.com/pypi/simple/ 阿里
    http://pypi.hustunique.com/simple/ 华中理工大学
    http://pypi.sdutlinux.org/simple/ 山东理工大学
    http://pypi.mirrors.ustc.edu.cn/simple/ 中国科学技术大学
    https://pypi.tuna.tsinghua.edu.cn/simple 清华
    

    代码如下:

    pip install 模块名 -i 网址
    

    以清华镜像举例

    pip install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple
    

    注意:如果是原生态的cmd窗口安装的,会提示加个--user命令,读者按照指示即可。

    二、Python读取Excel图片

    上面说过,Python读取Excel图片有两种方法。
    第一种:将xlsx后缀名改为zip形式,即进行压缩。而后读取里面存储图片的文件,将里面的图片取出来。
    第二种:用提取到粘贴板中的方法将图片保存到JPG、PNG等格式中

    两种方法各有缺点和优点,第一种方法缺点是代码量比较长,优点是万能,Excel的所有格式都可以运用。
    第二种的优点是代码量少,缺点是对于一些xlsx的文件运用不了。

    首先我们先讲解第一种方法,之后在讲解第二种方法时,大家可以进行对比!

    讲解之前我们用的是以下的example.xlsx文件,里面有四个工作表,每个工作表都有一张数据可视化图。例如工作表3中的气泡图如下:

     

    2.1 方法一

    和之前的文章一样,我们先给出全部代码与效果图之后再进行讲解

    import os
    import zipfile
    import os
    from PIL import Image
    import numpy as np 
    path = r'D:'
    count = 1
    for file in os.listdir(path):
        new_file = file.replace(".xlsx",".zip")
        os.rename(os.path.join(path,file),os.path.join(path,new_file))
        count+=1
    print('总共有'+str(count)+'个文件夹')
    number = 0
    craterDir = "D:/"  # 存放zip文件的文件夹路径
    saveDir = "D:/"  # 存放图片的路径 
    list_dir = os.listdir(craterDir) 
    for i in range(len(list_dir)):
        if 'zip' not in list_dir[i]:
            list_dir[i] = ''
    while '' in list_dir:
        list_dir.remove('')    
    for zip_name in list_dir:
        print(zip_name)
        azip = zipfile.ZipFile(craterDir + zip_name)
        namelist = (azip.namelist())
     
        for idx in range(0,len(namelist)):
            if namelist[idx][:9] == 'xl/media/':#图片是在这个路径下
                img_name = saveDir + str(number)+'.jpg'
                f = azip.open(namelist[idx])
                img = Image.open(f)
                img = img.convert("RGB")
                img.save(img_name,"JPEG")
                number += 1
    azip.close()  #关闭文件,必须有,释放内存
    

    效果展现如下:

     

     

    可以看到example.xlsx里面的四张工作表里的图片都提取出来,保存在本地。

    现在我们进行代码解析,首先,引入相关包

    import os
    import zipfile
    from PIL import Image
    import numpy as np 
    

    其次,就是将xlsx格式结尾的文件夹进行压缩,转化成zip结尾的文件

    path = r'D:'   #excel文件位置
    count = 1
    for file in os.listdir(path):
        new_file = file.replace(".xlsx",".zip")
        os.rename(os.path.join(path,file),os.path.join(path,new_file))
        count+=1 
    

    这里首先设置了example.xlsx的文件位置,在D盘的根目录,读者需要做调整的话在path那行代码修改即可。

    其次用os模块的listdir函数用于返回指定的文件夹包含的文件或文件夹的名字的列表。再用for循环遍历这个列表,将.xlsx结尾的改为.zip结尾。

    同时再用os.rename()函数重命名对应的文件夹。count是用来告诉用户这个文件夹有多少个文件的,用于检验。

    最后,就是在这些压缩过后的文件中,提取图片。代码如下

    number = 0
    craterDir = "D:/"  # 存放zip文件的文件夹路径
    saveDir = "D:/"  # 存放图片的路径 
    list_dir = os.listdir(craterDir) # 获取所有的文件名
    
    for i in range(len(list_dir)):
        if 'zip' not in list_dir[i]:
            list_dir[i] = ''
    while '' in list_dir:
        list_dir.remove('')   
    

    下面是代码解析:

    首先,number=0是用来最后命名图片的。craterDir是指存放zip的文件夹路径,saveDir指存放提取后的图片的指定路径。用os.listdir()函数来获取在这个路径下的所有文件名字。

    这里强调下,本章代码采用的路径,除了上面讲过的path外,其他都用绝对路径,因为如os模块和zipfile模块,这些模块用绝对路径更不会报错。

    下面用一个for循环加个while循环的用途是剔除不是.zip结尾的文件夹。这时有读者会问,用for循环加个列表del函数不香吗?

    其实是不行的,大家可以去尝试一下。原因是,你每次del广域网一个列表的元素,列表的数量值会一直在变而不是固定的,这样就会导致超出索引的错误。

    for zip_name in list_dir:
        print(zip_name)
        # 默认模式r,读
        azip = zipfile.ZipFile(craterDir + zip_name)
        # 返回所有文件夹和文件
        namelist = (azip.namelist())
     
        for idx in range(0,len(namelist)):
            if namelist[idx][:9] == 'xl/media/':#图片是在这个路径下
                img_name = saveDir + str(number)+'.jpg'
                f = azip.open(namelist[idx])
                img = Image.open(f)
                img = img.convert("RGB")
                img.save(img_name,"JPEG")
                number += 1
    azip.close()  #关闭文件,必须有,释放内存
    

    最后就是读取zip文件中的图片。用for循环遍历我们已经处理过的list——dir列表,得到zip文件名,再用zipfile.ZipFile()函数来打开我们zip文件。其中azip.namelist()函数是用来装zip文件里面所有文件的文件名列表。

    接下来可以进入到zip文件中仔细观察,可以发现我们所需要的图片在'xl/media/'这个路径下,有了这个目标后,我们再用for循环遍历zip文件里的所有文件,找到路径下的图片。

    第二个for循环需要注意几点:

    azip.open()是zipfile模块里的打开命令。相对应的,就有azip.close()这个命令,这个命令再整个程序运行完后必须运训,因为不仅可以清理所占空间,而且如果你需要还原xlsx文件格式的话,你就必须得关闭,不然会报错。

    Image.open()是模块Pillow模块的读取图片函数,也算是我们本章最重要的函数之一了,与其搭配的是Image.save()函数,是用来存储的。中间插着一段代码img.convert("RGB"),这个一般都是要用到的,我们存储的图片大多数是有色的,也就是RGB图像,如果是黑白的话就要调一下参数。有兴趣的读者可以自行查阅文献。

    2.2 方法二

    接下来讲解第二种方法,先上代码

    from PIL import ImageGrab
    import win32com.client as win32
    
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    workbook = excel.Workbooks.Open(r'D:\example.xlsx')
    
    num = 1
    for sheet in workbook.Worksheets:
        for i, shape in enumerate(sheet.Shapes):
            if shape.Name.startswith('Picture'):
                shape.Copy()
                image = ImageGrab.grabclipboard()   
                image.convert('RGB').save(r'D:\{}.jpg'.format(num), 'jpeg')
                num+=1
    excel.Quit()
    

    效果呈现:

     

     

    从上图可以看到,与方法一的效果相比,基本一致,除了没有进行压缩,下面简单说一下代码

    from PIL import ImageGrab
    import win32com.client as win32
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    workbook = excel.Workbooks.Open(r'D:\example.xlsx')
    

    首先先引入方法二相关的模块,第三行代码是引入模块win32中对Excel中的运用程序。第四行和方法一一样是读取D盘根目录下的example.xlsx文件。

    num = 1
    for sheet in workbook.Worksheets:
        for i, shape in enumerate(sheet.Shapes):
            if shape.Name.startswith('Picture'):
                shape.Copy()
                image = ImageGrab.grabclipboard()   
                image.convert('RGB').save(r'D:\{}.jpg'.format(num), 'jpeg')
                num+=1
    excel.Quit()
    

    第一行num=1,是用来为下面存储图片的图片命名的

    接下来就是进行for嵌套for,第一个for循环的目的是遍历所选Excel文件中的工作表,我们有四张图片放在example.xlsx的四个不同的工作表里。第二个for循环是用来遍历每个工作表中的图片并复制到粘贴板中的。

    其中,enumerate()函数是用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。这里的意思就是存放每张图片数据信息的索引。i是数据下标,shape是数据

    shape.Name.startswith('Picture')是判断获到的shape里面名字信息中的开头是否符合'pitcure',如果是,则返回True。

    shape.Copy()函数是对一个一个字典的浅复制(拷贝)。简单来说就是只在程序中的复制。

    ImageGrab.grabclipboard()函数是方法二的精髓,这个函数是抓取当前剪贴板的快照,返回一个模式为“RGB”的图像或者文件名称的列表。如果剪贴板不包括图像数据,这个函数返回空。读者可以使用函数isinstance()来检查该函数返回的是一个有效图像对象或者其他数据。

    image.convert('RGB').save(r'D:{}.jpg'.format(num), 'jpeg')这段语句,是将得到的image以jpg的格式存储。这里的jpeg其实就是jpg,只不过模块里以jpeg代替jpg。

    注意,这里必须用convert('RGB'),如果不使用.convert('RGB')进行转换的话,读出来的图像是RGBA四通道的,A通道为透明通道,运出来是没有图像显示的。因此使用convert('RGB')进行通道转换。

    至此,我们就讲完了使用Python提取Excel中图片的两种方法,大家可以根据自己的情况来选择如恶化提取Excel中的图片。

    二、Python写入Excel图片

    在讲完如何用Python提取Excel中图片之后,下面我们将讲解如何用Python将图片写入到Excel文件中。

    我们常用的模块是xlsxwriter。这里先介绍这个模块的常用插入图片函数

    worksheet.insert_image(row,col,image[,options] :在工作表单元格中插入一张图片

    参数介绍如下:

    • row(int) - 单元格所在的行(从0开始)
    • col(int) - 单元格所在的列(从0开始)
    • image(string) - 图片文件名(含路径)
    • options(dict) - 可选的图片位置,缩放,url参数

    同时insert_image()方法接受字典形式的可选参数来定位和缩放图片。默认值为

    {
        'x_offset': 0,    #以像素为单位,可以大于每个单元格的宽度和高度
        'y_offset': 0,
        'x_scale': 1,
        'y_scale': 1,
        'url': None,
        'tip': None,
        'image_data': None,
        'positioning': None,
    }
    

    上面几个参数主要作用如下:

    • x_scale和y_scale参数可以用于水平及垂直的缩放图片。
    • url参数可以为图片添加超链接/url, tip 参数为含有超链接的图片提供可选的鼠标悬停时的提示信息
    • image_data参数用于在io.BytesIO中添加内存中的字节流,一般不用
    • positioning参数可以用来控制图片对象的位置

    接下来会做一个简单的程序来演示:

    这里用一份数据简单的画出一个折线图,数据是一份广汇汽车的股票数据,从8月底到10月底的数据。以收盘价和时间画一个简单的折线图.

    代码如下:

    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib.style as psl
    import xlsxwriter
    fig = plt.figure()
    df = pd.read_excel(r'D:\数据.xlsx')
    title = ['日期','收盘价']
    df = df[title]
    plt.plot(df['日期'],df['收盘价'])
    plt.gcf().autofmt_xdate()#自动调整角度
    plt.savefig(r'D:\数据折线图.jpg')
    

    Python画出的图如下:

     

     

    现在我们要将其插入到一份名为数据image.xlsx的excel文件中,来看看代码怎么写👇

    首先使用xlswriter创建一个新Excel文件并添加一个工作表。

    
    workbook = xlsxwriter.Workbook(r'D:\数据images.xlsx')
    worksheet = workbook.add_worksheet()
    

    下面使用.insert_image插入图片。

    worksheet.write('A2', '插入第一张图片:')
    worksheet.insert_image('B2', r'D:\数据折线图.jpg')
    
    worksheet.write('A12', '插入第二张即位偏移图片:')
    worksheet.insert_image('B12', r'D:\数据折线图.jpg', {'x_offset': 15, 'y_offset': 10})
    
    
    # 插入一张缩放了的图片。
    worksheet.write('A23', '插入第三张缩放了的图片:')
    worksheet.insert_image('B23', r'D:\数据折线图.jpg', {'x_scale': 0.5, 'y_scale': 0.5})
    
    workbook.close()
    

    最后要注意一定要用workbook.close()才能生成,效果呈现如下

     

     

    可以看到,我们使用Matplotlib生成的折线图被插入到我们预定的指定位置中!

    至此,本文就结束了,相信你已经学会如何使用Python与Excel图片之间的交互,并能够结合具体的需求进行批量操作

    展开全文
  • excel中的图片非常常见,但是通过python读取excel中的图片没有很好的解决办法。今天小编给大家分享一种比较聪明的方法,感兴趣的朋友跟随脚本之家小编看看吧
  • 作为Java程序员,Java自然是最主要的编程语言。但是Java适合完成大型项目,...python作为一门脚本语言,可以实现快速编写和快速调试等特性,很适合用于解决日常工作中小的工作任务。一般使用结构化的编程思路,按照...
  • python读取excel中的图片

    千次阅读 2020-01-08 08:51:36
    环境准备: python3 pillow pip install pillow pypiwin32 pip install pypiwin32 代码 from PIL import ImageGrab import win32com.client as win32 excel = win32.gencache.Ensure
  • # 读取Excel中的图片地址,下载图片 # 导入2个包,导入方法为命令行里执行pip install openpyxl import openpyxl import requests # 下载图片 def download_img(url, token, pic_name): # 设置http header,视情况...
  • # 获取总行数 nrows = sh.nrows print("nrows=",nrows) for i in range(nrows): print("下载第%d个图片",i) url = sh.cell_value(i,4) # 依次读取每行第5列的数据,也就是 URL name=sh.cell_value(i,0)#读取图片名称...
  • 作为Java程序员,Java自然是最主要的编程语言。但是Java适合完成大型项目,对于...python作为一门脚本语言,可以实现快速编写和快速调试等特性,很适合用于解决日常工作中小的工作任务。一般使用结构化的编程思路,...
  • 话不多说, 直接上demo ...# 定义需要处理的excel路径和sheetname excel_root = "xxx/xxx/xxx.xlsx" sheet_name = "sheet_name" workbook = load_workbook(filename=excel_root) sheet = workbook[sheet_
  • def localExcel(dayslist): df = pd.read_excel(zebraio) test_data = [] for i in df.index.values: # 获取行号的索引,并对其进行遍历... ['excel1', 'excel2', 'excel3', 'excel4', 'excel5']) # loc[i]这里就
  • python读取excel表格,并将读取的输入写入到新的excel表格中遇到的从excel读取日期时变为浮点数的解决办法新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的...
  • python读取excel文件

    千次阅读 2019-07-08 10:09:14
    这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • # 设置要下载的图片的范围,对应于 Excel 中的行数 start = 1 #获取excel nrows = sht.nrows; for i in range(start, nrows): url = sht.cell(i, 9).value # 依次读取每行第十列的数据,也就是 URL if url: ...
  • python读取excel内容并邮件群发

    千次阅读 2019-01-14 22:25:44
    需求:读取excel中的个人信息,并将个人信息插入到对应的每个人的邮件中,邮件需要必要的格式化(个别字体突出、文字在邮件中的位置等),邮件正文中包含图片。 参考:廖雪峰的教程 代码实现 import os import ...
  • 最简单的词云图就是这种,英文的,不读取文件,不指定背景形状图片,不指定字体。 #复制文本用字符串表示 mytext = With his wife's encouragement, Minister Hacker decides he should focus on accomplishing 1 or...
  • import webbrowser import xlrd wb = xlrd.open_workbook("demo.xlsx") sht = wb.sheet_by_name("Sheet1") for x in range(sht.nrows): ...[在这里插入图片描述](https://img-blog.csdnimg.cn/20200807104345256.jp
  • 需要用到的包: 进度条:progressbar pip install ... excel操作包openpyxl pip install openpyxl -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com 食用指南: 文件目录

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 209
精华内容 83
关键字:

python读取excel图片

python 订阅