python将excel表格里面的url链接转换成图片
背景:
报表里面的图片一般都是不会直接存图片的实体,一般是存图片存放的位置,也就是url,然后报表的使用对象也不是程序相关工作者,只会使用简单的excel功能,于是有了如下对话:
小哥哥,你可以把里面的url变成图片吗?这样我们就可以直接使用啦。
这不就来看看咋弄合适。
可能用到的库:
import io
import requests
import time
import re
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
用户场景分析:
使用对象一般是这种格式的excle:
很明显第一行是标题,第二行开始就是内容,而我们需要转换的内容在第n(n>=2)行的C(?)列,那么我们想要把图片的url拿出来,那至少要知道url在哪里列,这个url,可能有多个,所以我们可以提取第二行(显然可以肯定要求变更行数)的数据进行清洗。
def urlpoint(data):NumTip = []if data == []:return -1for i in range(len(data)):strname =str(data[i])# 用于匹配至少一个图片形式pattern = re.compile(r'(.png|.img|.gif|.jpg|.jpeg)$') m = pattern.search(strname)if m == None:continueelse:NumTip.append(i)# 如果一个图片地址都没有找到就返回-1,不然返回下表的集合if NumTip == []:return -1else:return NumTip
这样就可以得到我们的目标列的下标了, 在图示中的url是没有带前面的路由地址的,因为一个公司的图片网址是往往是固定的,这样存储可以省一点空间,但是我们要兼容有些直接就是图片地址的情况。于是:
url = cell.value#阻止某些为空if url == None:continue#事实上这里可以检查一下url是否有前缀http 这样可以兼容一下其他形式的图片pattern = re.compile(r'^(https://|http://)') # 用于匹配至少一个数字m = pattern.match(url)if m == None:url ='https://image.baidu.com/' +url
然后我们需要去通过url获取到图片,将图片存在内存里,然后在写入excel里,这个时候需要对获取的图片按比例进行裁剪,具体函数:
def img_resize(width, height):if width > height:height = height*200//widthwidth = 200else:width = width*200//heightheight = 200return width, height
然后我们将这个写入excel:
# 删除超链接cell.hyperlink = None# # 删除内容cell.value = ""# 设置行高ws.row_dimensions[cell.row].height = 200# 下载图片到内存res = requests.get(url)img = Image(io.BytesIO(res.content))# 等比例缩放图片width, height = img_resize(img.width, img.height)img.width = widthimg.height = height# 拼接目标单元格 subscript 是替换url Ccolumns+i+1 是按顺序放后面endnum =str(Cnum[subscript]) + str(cell.row)print('成功添加到第:',endnum,'列')# 添加图片到指定单元格ws.add_image(img, endnum)
这个时候一行的图片就转换好了,然后我们对整个文档进行遍历,就可以完成了。
完整代码如下:
from csv import excel
import io
import requests
import time
import re
from openpyxl import load_workbook
from openpyxl.drawing.image import Image# 保持图片的比例
def img_resize(width, height):if width > height:height = height*200//widthwidth = 200else:width = width*200//heightheight = 200return width, height
# 获得选中的表的最大行数和最大列数
def getRowsClosNum(self):rows = self.max_rowcolumns = self.max_columnreturn rows,columnsdef get_row_value(self, row):columns = self.max_columnrow_data = []for i in range(1, columns + 1):cell_value = self.cell(row=row, column=i).valuerow_data.append(cell_value)return row_datadef urlpoint(data):NumTip = []if data == []:return -1for i in range(len(data)):strname =str(data[i])# 用于匹配至少一个图片形式pattern = re.compile(r'(.png|.img|.gif|.jpg|.jpeg)$') m = pattern.search(strname)if m == None:continueelse:NumTip.append(i)# 如果一个图片地址都没有找到就返回-1,不然返回下表的集合if NumTip == []:return -1else:return NumTipdef TurnURLPictures(dataname,textname,ExcleSheet=0):start = time.clock()# 用户下载的位置textname ='download/' +str(dataname)+'.xlsx'# 用户上传的位置dataname ='files/'+str(dataname)+'.xlsx'wb = load_workbook(dataname)Sheetnames =wb.sheetnames#默认是第一个表ws = wb[Sheetnames[ExcleSheet]]# 获得第二行的数据,通常来说第一行是标题名,带入get_row_value()里面,cData = get_row_value(ws,2)#得到这个表的行高Crows,Ccolumns= getRowsClosNum(ws)#url 所在列urlnum =urlpoint(cData)if urlnum == -1:print ('Its second line does not have a URL')return -1#拼接操作的xlsx 文件的行数 一般为2-maxrow Cnum ={1:"A",2:"B",3:"C",4:"D",5:"E",6:"F",7:"G",8:"H",9:"I",10:"J",11:"K",12:"L",13:"M",14:"N","15":"O",16:"P",17:"Q",18:"R",19:"S",20:"T",21:"U",22:"V",23:"W",24:"X",25:"Y"}# GroupNum = len(urlnum)for i in range(GroupNum):subscript = urlnum[i]+1name =str(Cnum[subscript])+'2:'+str(Cnum[subscript])+str(Crows)ws.column_dimensions[Cnum[subscript]].width = 50for cell, in ws[name]:url = cell.value#阻止某些为空if url == None:continue#事实上这里可以检查一下url是否有前缀http 这样可以兼容一下其他形式的图片pattern = re.compile(r'^(https://|http://)') # 用于匹配至少一个数字m = pattern.match(url)if m == None:url ='https://image.baidu.com/' +url# 删除超链接cell.hyperlink = None# # 删除内容cell.value = ""# 设置行高ws.row_dimensions[cell.row].height = 200# 下载图片到内存res = requests.get(url)img = Image(io.BytesIO(res.content))# 等比例缩放图片width, height = img_resize(img.width, img.height)img.width = widthimg.height = height# 拼接目标单元格 subscript 是替换url Ccolumns+i+1 是按顺序放后面endnum =str(Cnum[subscript]) + str(cell.row)print('成功添加到第:',endnum,'列')# 添加图片到指定单元格ws.add_image(img, endnum)start2 = time.clock()wb.save(textname)print('Running time: %s 毫秒' % (start2*1000-start*1000))return Crows/60if __name__=="__main__":TurnURLPictures('bbf579f8a4c311ec8f8b1831bf2aef29','测试')
效果如下:
python将excel表格里面的url链接转换成图片相关推荐
- 把文件夹里的文件名快速导出到Excel表格里,并且重命名成中文,防乱码
把文件夹里的文件名快速导出到Excel表格里 打开cmd dir 需要整理的文件地址/b>需要放置的位置\需要整理的文件.xls 例:dir d:\123/b>d:\new.xls 重命名 ...
- 怎么把html表格转化为excel,导出html到excel表格数据格式-如何将html转换成excel
如何将html转换成excel 一:Html转为Excel 1 我们打开网络上的一个包含表格内容的页面,点击菜单栏-文件-另存为. 2 弹出窗口选择保存路径,将保存类型选为"htm 或Htm ...
- 把Excel里的url链接转换为图片显示
先看我们原始数据 这里的图片是http链接,怎么把链接转成图片呢,我们接着往下看吧 我们把链接复制到新的execl表格里面 我们修改下表格的单元格行高和行宽,这里有个技巧,我们点击下表格的左上角的三角 ...
- python处理excel案例_使用Python处理Excel表格的简单方法
使用Python处理Excel表格的简单方法 Excel 中的每一个单元,都会有这些属性:颜色(colors).number formatting.字体(fonts).边界(borders).alig ...
- Python读写Excel表格,就是这么简单粗暴又好用(文末免费送资料)
最近在做一些数据处理和计算的工作,因为数据是以.csv格式保存的,因此刚开始直接用Excel来处理.但是做着做着发现重复的劳动其实并没有多大的意义,于是就想着写个小工具帮着处理. 以前正好在一本书上看 ...
- python处理excel表格数据-零基础使用Python读写处理Excel表格的方法
引 由于需要解决大批量Excel处理的事情,与其手工操作还不如写个简单的代码来处理,大致选了一下感觉还是Python最容易操作. 安装库Python环境 首先当然是配环境,不过选Python的一个重要 ...
- 使用python用什么软件-Python读写Excel表格,就是这么简单粗暴又好用
Python读写Excel表格,就是这么简单粗暴又好用 2019-04-18 13:45:31 11点赞 107收藏 1评论 最近在做一些数据处理和计算的工作,因为数据是以.csv格式保存的,因此刚开 ...
- 用 Python 整理 Excel 表格
用 Python 整理 Excel 表格 思路 xlrd和xlsxwriter 读取所有xls和xlsx表格 数据处理 实例 回顾 代码下载 一直都是拿Python来玩,今天正经一回,解决下好友的需求 ...
- python做excel表格代码_Python读写Excel表格
最近在做一些数据处理和计算的工作,因为数据是以.CSV格式保存的,因此刚开始直接用Excel来处理. 但是做着做着发现重复的劳动,其实并没有多大的意义,于是就想着写个小工具帮着处理. 以前正好在一本书 ...
最新文章
- 2015 AlBaath Collegiate Programming Contest(2月14日训练赛)
- tomcat 日志分割脚本
- latex 文章前头引用包
- 自定义服务器控件(扩展现有 Web 控件)
- 5个常见的Hibernate异常及其解决方法
- 打印水仙花数oracle,javaScript实现回文数、水仙花数判断和输出斐波那契数列
- postgresql 安装使用
- 单片机拼字程序怎么做_餐饮怎么用微信小程序?餐饮行业怎么做小程序
- loadrunner录制回放常见问题及解决办法
- 机器学习——One-Hot编码
- Julia科学记数法格式输出问题
- SqList *L 和 SqList * L的区别
- 数值分析笔记 第一章 数值分析与科学计算引论
- 现场抽奖小程序_抽奖小程序助手转盘活动微信抽奖系统
- kubernetes证书配置相关
- 向梦想出发 - 全向轮移动底盘搭建
- 计算机组成原理框架结构图
- 无线路由器常用的五种工作模式详细介绍
- SkyEye与Trace32集成并搭建调试环境
- 【每日蓝桥】8、一三年省赛Java组真题“打印十字图”
热门文章
- 解读“Google十诫”
- php中sinfo代表什么,info.php · slulusu/家谱familytree - Gitee.com
- 【战神工具出品】解读百度的搜索结果千人千面算法原理
- 【颜色识别】机器视觉RGB识别系统【含GUI Matlab源码 951期】
- 那些曾伴我走过编程之路的软件(转)
- 解决Arduino使用LCD屏幕制作电子时钟的问题
- [已解决]植物大战僵尸全屏时报错:Fatal Error!
- 人大经济论坛SAS版的几个问题
- 投资理财__读懂资产负债表
- 回收站删除的文件恢复,保姆级教学