大家好,在使用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 excel截图保存_如何用Python读取Excel中图片?又如何用Python往Excel中写入图片?...相关推荐

  1. python excel截图保存_python 对excel进行截图

    工作中需要对excel的单元格区域进行截图,以前是调用vba进行(走了很多弯路,虽然能实现,但比较low),后来逐步发现python的win32com与vba师出同门,很多方法操作都是类似的. 可以对 ...

  2. excel自动保存_萌新必看!python处理excel实例

    电脑上必安装的办公软件三大软件:word.excel.ppt,其中excel是在处理数据效率最高,也是最为繁琐的,因此高效快捷使用excel尤为重要,以下为大家介绍使用python更自动化处理exce ...

  3. python自动截图保存(网课利器)

    最近线上报告太多,老师要求我对会议ppt进行截图.手动截图很耗时,保存命名也比较麻烦.有时候刚打开截图,那一页就跳过去了--所以想到用python编写一个自动截图保存的程序,这样就能安心听报告啦. 库 ...

  4. python屏幕截图并保存_用Python保存屏幕截图(不使用PIL)

    起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...

  5. python 运行结果保存_『如何将python运行结果保存成txt,万分感谢呐』python txt教程...

    如何将python运行结果保存成txt,万分感谢呐 把赋值量 content f = open("text.txt",'wb') f.write(content) f.close( ...

  6. python 自动化框架打包_听说很多人都不会打包,教你Python实现前端自动化打包部署!...

    作为一名专职前端开发的我,为了帮助解决目前工作中的一些繁琐的工作(主要是处理 excel数据),解放程序员双手,前阵子就刚刚入了 python 的坑,毕竟也算是门工具语言,都已经加入少儿编程了,哈哈哈 ...

  7. python调用ping命令_我可以创建一个脚本来测试是否可以在python服务器上远程使用SSH和PING命令吗? - python...

    我可以创建脚本来测试是否可以在python中远程使用服务器上的SSH和PING命令吗? 参考方案 好的,这是Python3和Linux的示例.只需记住,您的目标主机/服务器必须正在运行SSH服务器才能 ...

  8. python计算股票趋势_通过机器学习的线性回归算法预测股票走势(用Python实现)...

    1 波士顿房价数据分析 安装好Python的Sklearn库后,在安装包下的路径中就能看到描述波士顿房价的csv文件,具体路径是"python安装路径\Lib\site-packages\s ...

  9. python布尔测试对象_面试题十九期-测试开发面试题之python系列-这个中~

    坚持梦想 就算所有人都不支持你.这条路会很曲折,你也会一度认为是不是自己选错了,但只要坚持,就算最后没有成功,但努力了就不会有遗憾. 测试开发python系列面试题 01 单选题 1.下列哪个语句在P ...

  10. python大家都会吗_一篇告诉你为什么人人都应该学点Python?

    全文主要分为以下四个部分,各位看官可以自行选择阅读,写文的目的是希望大家能在学习了解Python的同时能在日常生活中运用上,若有补充,欢迎在评论区留言.本文默认已经安装好Python 2.7环境,需要 ...

最新文章

  1. ASP.NET Core奇遇记:无用户访问,CPU却一直100%
  2. Android Navigation Drawer(导航抽屉)
  3. 当安全遇到大数据 “永恒之蓝”也将无所遁形!
  4. ubuntu12.04安装教程
  5. debian下ror新建项目报错解决
  6. 是时候重构下自己的博客了
  7. linux sendemail,在linux下使用sendEmail发送邮件
  8. 3.PHP核心技术与最佳实践 --- PHP网络技术及应用(cURL,socket,SMTP,WebService,Cookie,Session,localStorage)
  9. 【一起学爬虫】爬虫实战:爬取京东零食
  10. Vlan和Trank
  11. 好领导,本来应是挖渠人
  12. Android studio断点调试源码
  13. 网页第三方追踪原理——如何通过1像素的图片追踪
  14. 四旋翼飞行器平衡传感器数据 处理方法探讨
  15. APP开发选择什么框架好? 请看这里!
  16. Project Euler Problem 53: Combinatoric selections【组合数】
  17. 计算机专业电脑i5与i7的区别,电脑i5处理器和i7处理器有什么区别
  18. OP-TEE基本的从芯片设计到给客户的安全问题浅析
  19. mysql导入本地文件_Mysql透过txt文件导入本地数据_mysql
  20. 一位新竹科学园区朋友的来信

热门文章

  1. 什么是TPS,什么是QPS
  2. manjaro install ftp server
  3. html文本只显示一行,如何让div中的文字只显示一行,多余的文字隐藏并加上省略号(超链接形式)...
  4. 如果牛顿是程序员,那么?
  5. windows10 安装两台mysql进行主从复制
  6. linux系统管理之系统优化(连载)
  7. Touchbar Pet 0.8.2 最新版 (Touch Bar触控栏养宠物)
  8. C++ 面试实战经验分享
  9. 零基础html5网站开发学习步骤方法
  10. JAVA 小易爱回文