1 背景

因为某些原因,我们的Excel里会放入一些图片链接,但查看的时候需要一个个点开,通过浏览器显示,非常麻烦。

我们可以通过python的openpyxl这个库来解决此问题,一键替换所有链接为图片。

2 环境

Python 3.7.3 64-bit

openpyxl 3.0.0 (用于操作Excel)

requests 2.22.0 (用于下载图片)

validators 0.14.1 (用于校验文本是否是链接)

3 openpyxl

wb = openpyxl.load_workbook(path)  # 加载Excel文件sheet_names = wb.sheetnames  # 获取Excel的sheet列表sheet = wb[sheet_name]  # 指定sheetrow_num = sheet.max_row  # 获取sheet行数
column_num = sheet.max_column  # 获取sheet列数for row in sheet.rows:  # 遍历sheet所有行
for column in sheet.columns:  # 遍历sheet所有列for row in sheet.rows:  # 遍历sheet数据单元格for cell in row:cell_value = cell.value  # 单元格值cell_row = cell.row  # 单元格所在行索引cell_column = cell.column  # 单元格所在列索引cell_column_letter = openpyxl.utils.get_column_letter(cell.column)  # 单元格所在列名称cell_coordinate = cell.coordinate  # 单元格坐标sheet.row_dimensions[cell_row].height = IMG_CELL_HEIGHT  # 设置行高
sheet.column_dimensions[cell_column_letter].width = IMG_CELL_WIDTH  # 设置列宽img = openpyxl.drawing.image.Image(img_path)
sheet.add_image(img, cell_coordinate)  # 往Excel里嵌入图片wb.save(filename=path_excel_with_img)  # 保存Excel

4 主要代码

def is_img_url(self, value: str):"""检测单元格值是否是图片链接"""if value.startswith("=HYPERLINK"): value = value[12:-2]  # 去掉excel超链接函数is_img_url = Falseif validators.url(value):  # 判断是否是urlfor img_ext in self.img_ext:if value.lower().endswith(img_ext):  # 判断是否是图片文件后缀名is_img_url = Truebreakreturn is_img_url, value
def download_img(self, img_url, sheet_name=None, coordinate=None, timeout=15):"""图片下载:param img_url: 图片链接:param sheet_name: ExcelSheet名称:param coordinate: Excel单元格坐标:param timeout: 图片下载超时时间"""img_path = self.img_url_to_path(img_url)  # 图片保存地址if os.path.exists(img_path):  # 判断图片是否已经存在self.stdout(sheet_name, coordinate, img_url, self.IMG_DOWNLOAD_EXISTS)else:self.check_and_mkdir(path=img_path)  # 判断保存图片的文件夹是否存在,不存在则创建r = requests.get(img_url, timeout=timeout)  # 发起HTTP请求if not r.content[:4] == b'\xff\xd8\xff\xe0':  # 判断返回内容是否是图片格式self.stdout(sheet_name, coordinate, img_url, self.IMG_DOWNLOAD_ERROR, self.IMG_URL_ERROR)return Falsewith open(img_path, "wb") as f:  # 保存图片至本地f.write(r.content)self.stdout(sheet_name, coordinate, img_url, self.IMG_DOWNLOAD_DONE)return True
def add_img_of_sheet(self, sheet_name):"""Excel中添加图片:param sheet_name: Sheet名称"""sheet = self.wb[sheet_name]  # 指定Sheetfor row in sheet.rows:  # 遍历所有行for cell in row:  # 遍历单元格cell_value = str(cell.value)  # 单元格值is_img_url, img_url = self.is_img_url(cell_value)if is_img_url:  # 如果单元格存放的是图片链接img_path = self.img_url_to_path(img_url)  # 获取图片本地保存地址if os.path.exists(img_path):  # 判断本地图片是否存在try:img = openpyxl.drawing.image.Image(img_path)  # 加载图片img.height = self.IMG_HEIGHT  # 设置图片高度img.width = self.IMG_WIDTH  # 设置图片宽度sheet.add_image(img, cell.coordinate)  # 嵌入图片sheet.row_dimensions[cell.row].height = self.IMG_CELL_HEIGHT  # 设置行高column_letter = openpyxl.utils.get_column_letter(cell.column)  # 获取列名sheet.column_dimensions[column_letter].width = self.IMG_CELL_WIDTH  # 设置列宽cell.alignment =  openpyxl.styles.Alignment(wrapText=True)  # 设置单元格属性 - 自动换行except Exception as e:print_exc()  # 打印详细错误self.img_add_failed[img_url] = (sheet_name + " " + cell.coordinate, str(e))  # 记录错误信息self.stdout(sheet_name, cell.coordinate, img_url, str(e))else:self.img_add_failed[img_url] = (sheet_name + " " + cell.coordinate, self.IMG_DOWNLOAD_NOT_EXISTS)self.stdout(sheet_name, cell.coordinate, img_url, self.IMG_DOWNLOAD_NOT_EXISTS)

5 最终效果

点击Trans菜单下的IMG to Excel选项,一键将Excel中的图片链接转化为图片,首先需要复制Excel文件,否则会报如下错误:

正常效果:

6 源码地址

项目代码在github上:https://github.com/TheUncleWhoGrowsBeans/tkGo

【tkGo】将Excel里的图片链接替换为图片(Excel嵌入图片)相关推荐

  1. excel根据条件列转行_如何将excel里的一列数据转为一行 excel数据列转行的办法步骤...

    如何将excel里的一列数据转为一行 excel数据列转行的办法步骤 我们的生活中越来越离不开PC,但在使用PC的过程中总会遇到各种各样的问题.知识屋致力于给PC小白朋友们介绍一些简单常用问题的解决办 ...

  2. Typora等markdown笔记软件图片链接失效的问题解决办法,图片的相对路径、绝对路径的设置,图片上传到图床的方法

    文章目录 -遇到的问题:Typora编辑MD文档,图片失效的问题解决 -解决的方法: 方法一:本地图片,使用相对路径,并将图片放在和md文件的同一目录下 步骤1.Typora的图片根目录设置 步骤2. ...

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

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

  4. java excel 搜索_Java 查找、替换并高亮Excel数据

    需求介绍 我有一个含有大量数据资料的Excel文档,现需要对其中的一个或多个单元格的数据进行修改.请问如何才能用Java代码快速查找到指定数据,然后用新文本将其替换并高亮?例如,在下图所示的Excel ...

  5. excel根据颜色赋值 Excel填充颜色单元格替换成数字 excel把所有红色变成1

    法/步骤 案例中,周一到周五产生倒班的,是用橙色标识的.周六周日的倒班是用蓝色标识的.然后,我们要将橙色的单元格替换成数字30,蓝色的单元格替换成数字50,分别代表30元和50元的倒班费. 使用快捷键 ...

  6. .net aspose.words 域加载图片_使用Python批量替换csdn文章的图片链接

    欢迎大家关注我的微信公众号"IT工匠"获取更多资源(涉及算法.数据结构.java.深度学习.计算机网络.python.Android等互联网技术资料). 前言 笔者之前的写作习惯一 ...

  7. 使用Python批量替换csdn文章的图片链接(解决csdn无法加载第三方图床的问题)

    前言 笔者之前的写作习惯一直是在本地(Mac Typora Ipac)写好之后将markdown代码粘贴到csdn,图片是Ipac自动上传到微博匿名图床上,用了大概一年多都没有问题,直到前段时间突然发 ...

  8. 掘金外链即将失效?论如何用脚本一次性下载/替换失效的外链图片

    前言 大约一个月前,微博的图片外链失效了,以及掘金因为盗链问题也于2019/06/06决定开启防盗链,造成的影响是:个人博客网站的引用了这些图片外链都不能显示. 目前微博和掘金的屏蔽,在CSDN和se ...

  9. 批量删除EXCEL里的软回车

    批量删除EXCEL里的软回车 目的:查找excel单元格中的换行符(alt + enter),并且把它代替为空. 通过在查找框内(通过按ctrl + f调出),在[替换内容]内输入: 第1种方法:按住 ...

最新文章

  1. zabbix如何配置微信报警
  2. Scala集合体系:可变集合和不可变集合
  3. 命令行参数怎么输入_太好用了!谷歌开源的命令行接口工具fire
  4. Hive精华问答 | Hive和传统数据库有什么不同?
  5. java自定义注解实现日志功能
  6. Flex Gumbo中如何自定义HSlider数据Tip样式的例子
  7. Aruba 云服务代金券
  8. SourceTree 密码填写正确但是拉取显示密码错误解决
  9. 浑水摸「YY」、「侠盗」苹果和辛巴的「麦乳精」|极客一周
  10. 使用Python、pandas、pyecharts进行数据分析——实例讲解
  11. flush和evit
  12. c语言左移函数_corl_,crol(crol函数怎么左移)
  13. 人脸对齐实现“平均脸”制作
  14. ijkplayer 代码走读之 播放器网络数据读取过程详解2
  15. Hadoop3.2.0 HDFS DataNode管理员指南
  16. Pycharm2020.1安装中文语言插件教程,不需要汉化
  17. sql Server 创建临时表 嵌套循环 添加数据
  18. Acne Scars Treatment - Probably the Best Acne Scars Treatment Available
  19. 江苏学生考计算机要多少分录取,江苏高考多少名可以上211 最低要考多少分
  20. win10怎么练计算机一级,1步打造极限精简的win10系统,让老电脑像新机般流畅,再也不卡了...

热门文章

  1. 第一位程序员原来是一个女性!
  2. k8s 服务注册与发现(二)Kubernetes内部域名解析原理
  3. spark steaming的性能问题
  4. BeanUtils.populate的用法
  5. 微信公众号文章信息(阅读量、在看、点赞数)获取
  6. 记录一下向npmjs上发布包遇到的坑
  7. PHP可视化告警规则引擎,开源可视化规则引擎 决策引擎与规则引擎有什么区别?...
  8. 大数据时代,我们需要“被遗忘权”(转)
  9. A component required a bean of type ‘com.yida.data.religion.common.dao.AddressInfoMapper‘ that could
  10. 都说数据是资产,那么到底什么是数据资产?