自动化办公 | (升级版)批量将Excel中的url链接转成图片②

Aidan075
• 阅读 1206

自动化办公 | (升级版)批量将Excel中的url链接转成图片②

大家好,我是小五🚀

前面我们使用python批量将Excel中的url链接转成图片,结果读者后来跟我反馈又遇到了一些问题。

于是乎,干脆对前几天的代码升级一波。

需求简介

具体原始数据和期望结果如下图所示:

自动化办公 | (升级版)批量将Excel中的url链接转成图片②

但这位读者朋友又遇到了一个问题👇

自动化办公 | (升级版)批量将Excel中的url链接转成图片②

  • 解决当url为空时代码停止运行的问题

  • 将图片保存到新增文件夹,大概有1.4W张图片,后续删图片有难度

第一个问题呢,只需加个判断语句就可以。至于将图片保存到新增文件夹,修改保存路径就可以解决了。

但是1.4w张图片下载到本地确实太麻烦了。经过@小明哥 的指导,其实我们下载图片到内存,完全不用再把图片下载到本地啦。

操作代码

本次升级除了解决被提出的两个问题,还有小五自己觉得不满意的地方。

等比例缩放图片

比如图片变形问题:

自动化办公 | (升级版)批量将Excel中的url链接转成图片②

从上图可以看到,之前代码运行后会给图片设置了固定尺寸72。但有些图片本身并不是正方形的,这就会导致插入后图片变形。

所以在@小明哥 的指导下,又构造了一个函数用来等比例缩放图片。

def img_resize(width, height):  
    if width > height:  
        height = height*72//width  
        width = 72  
    else:  
        width = width*72//height  
        height = 72  
    return width, height  

解决了这个问题,再说说如何将图片下载到内存。

下载到内存

StringIO经常被用来作字符串的缓存,因为StringIO的一些接口和文件操作是一致的,也就是说同样的代码,可以同时当成文件操作或者StringIO操作。

StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO[1]。我们这里对它的具体用法如下:

import io  
res = requests.get(url)  
img = Image(io.BytesIO(res.content))  

我们还可以顺便查看图片的格式

print(img.format)   # 获取图片的格式  

自动化办公 | (升级版)批量将Excel中的url链接转成图片②

其余代码

为了方便大家查看,关键代码都进行了注释。如果对某些操作处理不理解,可以查看上一篇文章《批量将Excel中的url链接转成图片》

for cell, in ws["B2:B6"]:  
    url = cell.value  
    print(url)  
    if url == None:  
        continue  
    # 删除超链接  
    cell.hyperlink = None  
    # 删除内容  
    cell.value = ""  
    # 设置行高  
    ws.row_dimensions[cell.row].height = 54  
    # 下载图片到内存  
    res = requests.get(url)  
    img = Image(io.BytesIO(res.content))  

    # 等比例缩放图片  
    width, height = img_resize(img.width, img.height)  
    img.width = width  
    img.height = height  
    # 添加图片到指定单元格  
    ws.add_image(img, f'B{cell.row}')  

wb.save('结果文件.xlsx')  

运行结果:

自动化办公 | (升级版)批量将Excel中的url链接转成图片②

成功完成需求🚀

参考资料

[1]

Python3-StringIO和BytesIO的总结: https://blog.csdn.net/yang\_bingo/article/details/84066217

本文转转自微信公众号凹凸数据原创https://mp.weixin.qq.com/s/Y08VWB2KFnxpAl_9mw9uSQ,可扫描二维码进行关注: 自动化办公 | (升级版)批量将Excel中的url链接转成图片② 如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Aidan075 Aidan075
2年前
自动化办公 | 批量将Excel中的url链接转成图片
大家好,我是小五🚀最近在交流群看到了一个问题小五对这个比较感兴趣,所以就要了示例数据找时间尝试做了一下。为啥感兴趣呢?因为前段时间刚帮群友做过一个相反的案例——。需求简介具体原始数据和期望结果如下图所示:同时还有两点要求思考了一下,我选择了一个折中的办法,先依照B列的url链接将图片下载到本地,再将本地图片依次插入B列的原位置。这次小五选择使用python,
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
2年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Wesley13 Wesley13
2年前
mysql查询每个学生的各科成绩,以及总分和平均分
今天看一个mysql教程,看到一个例子,感觉里面的解决方案不是很合理。问题如下:有学生表:!在这里插入图片描述(https://oscimg.oschina.net/oscnet/07b001b0c6cb7e0038a9299e768fc00a0d3.png)成绩表:!在这里插入图片描述(https://oscimg.o
Python进阶者 Python进阶者
1年前
我想统计每个箱体的accept_sum分别的和,可以怎么搞哇?
大家好,我是皮皮。一、前言前几天在Python白银交流群【对方正在输入中.....】问了一个Python可视化处理的问题,这里拿出来给大家分享下。下图是代码和报错截图:二、实现过程这里【瑜亮老师】指出问题所在,如下所示:图片很忠实的表示了他的代码:顺利地解
Python进阶者 Python进阶者
3个月前
盘点一个Python自动化办公的需求——一键批量插图到Excel指定单元格
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公的问题,问题如下:大佬们,昨天我在做插入excel图片的时候想起一个需求,好像挺难办的,也蛮现实的。比如每个图片是有名称的,但在做excel的时候,能不能按
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这