背景:

报表里面的图片一般都是不会直接存图片的实体,一般是存图片存放的位置,也就是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链接转换成图片相关推荐

  1. 把文件夹里的文件名快速导出到Excel表格里,并且重命名成中文,防乱码

    把文件夹里的文件名快速导出到Excel表格里 打开cmd dir 需要整理的文件地址/b>需要放置的位置\需要整理的文件.xls 例:dir d:\123/b>d:\new.xls 重命名 ...

  2. 怎么把html表格转化为excel,导出html到excel表格数据格式-如何将html转换成excel

    如何将html转换成excel 一:Html转为Excel 1 我们打开网络上的一个包含表格内容的页面,点击菜单栏-文件-另存为. 2 弹出窗口选择保存路径,将保存类型选为"htm 或Htm ...

  3. 把Excel里的url链接转换为图片显示

    先看我们原始数据 这里的图片是http链接,怎么把链接转成图片呢,我们接着往下看吧 我们把链接复制到新的execl表格里面 我们修改下表格的单元格行高和行宽,这里有个技巧,我们点击下表格的左上角的三角 ...

  4. python处理excel案例_使用Python处理Excel表格的简单方法

    使用Python处理Excel表格的简单方法 Excel 中的每一个单元,都会有这些属性:颜色(colors).number formatting.字体(fonts).边界(borders).alig ...

  5. Python读写Excel表格,就是这么简单粗暴又好用(文末免费送资料)

    最近在做一些数据处理和计算的工作,因为数据是以.csv格式保存的,因此刚开始直接用Excel来处理.但是做着做着发现重复的劳动其实并没有多大的意义,于是就想着写个小工具帮着处理. 以前正好在一本书上看 ...

  6. python处理excel表格数据-零基础使用Python读写处理Excel表格的方法

    引 由于需要解决大批量Excel处理的事情,与其手工操作还不如写个简单的代码来处理,大致选了一下感觉还是Python最容易操作. 安装库Python环境 首先当然是配环境,不过选Python的一个重要 ...

  7. 使用python用什么软件-Python读写Excel表格,就是这么简单粗暴又好用

    Python读写Excel表格,就是这么简单粗暴又好用 2019-04-18 13:45:31 11点赞 107收藏 1评论 最近在做一些数据处理和计算的工作,因为数据是以.csv格式保存的,因此刚开 ...

  8. 用 Python 整理 Excel 表格

    用 Python 整理 Excel 表格 思路 xlrd和xlsxwriter 读取所有xls和xlsx表格 数据处理 实例 回顾 代码下载 一直都是拿Python来玩,今天正经一回,解决下好友的需求 ...

  9. python做excel表格代码_Python读写Excel表格

    最近在做一些数据处理和计算的工作,因为数据是以.CSV格式保存的,因此刚开始直接用Excel来处理. 但是做着做着发现重复的劳动,其实并没有多大的意义,于是就想着写个小工具帮着处理. 以前正好在一本书 ...

最新文章

  1. 2015 AlBaath Collegiate Programming Contest(2月14日训练赛)
  2. tomcat 日志分割脚本
  3. latex 文章前头引用包
  4. 自定义服务器控件(扩展现有 Web 控件)
  5. 5个常见的Hibernate异常及其解决方法
  6. 打印水仙花数oracle,javaScript实现回文数、水仙花数判断和输出斐波那契数列
  7. postgresql 安装使用
  8. 单片机拼字程序怎么做_餐饮怎么用微信小程序?餐饮行业怎么做小程序
  9. loadrunner录制回放常见问题及解决办法
  10. 机器学习——One-Hot编码
  11. Julia科学记数法格式输出问题
  12. SqList *L 和 SqList * L的区别
  13. 数值分析笔记 第一章 数值分析与科学计算引论
  14. 现场抽奖小程序_抽奖小程序助手转盘活动微信抽奖系统
  15. kubernetes证书配置相关
  16. 向梦想出发 - 全向轮移动底盘搭建
  17. 计算机组成原理框架结构图
  18. 无线路由器常用的五种工作模式详细介绍
  19. SkyEye与Trace32集成并搭建调试环境
  20. 【每日蓝桥】8、一三年省赛Java组真题“打印十字图”

热门文章

  1. 解读“Google十诫”
  2. php中sinfo代表什么,info.php · slulusu/家谱familytree - Gitee.com
  3. 【战神工具出品】解读百度的搜索结果千人千面算法原理
  4. 【颜色识别】机器视觉RGB识别系统【含GUI Matlab源码 951期】
  5. 那些曾伴我走过编程之路的软件(转)
  6. 解决Arduino使用LCD屏幕制作电子时钟的问题
  7. [已解决]植物大战僵尸全屏时报错:Fatal Error!
  8. 人大经济论坛SAS版的几个问题
  9. 投资理财__读懂资产负债表
  10. 回收站删除的文件恢复,保姆级教学