当前位置: 首页 > news >正文

Python 提取excel中嵌入的图片

注意:是嵌入在单元格里的图片,嵌入在单元格里的图片,嵌入在单元格里的图片
会显示这种类似的命令(office好像不支持查看,wps可以查看这个位置显示的图片)
在这里插入图片描述

网上好多都说用 _image 提取,经测试,这种方案不适用这种嵌入在单元格里的图片提取

查阅资料发现,xlsx文件 本质上也是一种特殊的压缩文件,所以,把xlsx文件后缀改成zip,即可得到类似这种结构

在这里插入图片描述

在 /xl 下找到 cellimages.xml 文件 ,这个文件就是存放图片和对应名称关系的xml文件
/xl/media 文件夹下存放的是所有嵌入的图片(有重复的只会存一个)

cellimages.xml文件中,下图中圈出来的就是 excel里图片插入位置显示的代码和/xl/media下图片名之间的关系
在这里插入图片描述
“ID_B980C4566868422BA0D7FCE7587B7A7A” 这个是excel里显示的代码
<a:blip r:embed=“rId1” r:link=“rId2”/> 里的r:embed=“rId1” ,rId1 最后一个就是对应的图片名也就是对应image1.png
在这里插入图片描述

还有要注意的是, r:embed=“rId1” 里的rid 后边的数字,当数字大于2时,减1等于图片对应的后缀名
(不知道其它文件是不是也是这种情况)

实现样例代码

    def read_file_save(self,file,save_file):""":param file::param save_file::return:"""image = self.mark.read_image(file)self.mark.save_image(image,save_file)def read_xml(self,file):""":param file::return:"""with open(file,"r",encoding="utf-8")as fp:data = fp.read()res = re.findall('xdr:cNvPr id="(\d+)" name="(.*?)"/>',data)res2 = re.findall('r:embed="rId(\d+)" r:link',data)print(res,res2)print(len(res),len(res2))for index,(ind,name) in enumerate(res):ind2 = str(int(res2[index])-1) if int(res2[index])>2 else res2[index]img_file = rf"D:\Desktop\1\9\副本\xl\media\image{ind2}.png"print(ind,name,ind2,img_file)save_file = rf"D:\Desktop\1\9\副本\xl\media2\{name}.jpg"self.read_file_save(img_file,save_file)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • WPF的5种绑定模式
  • 必应Bing国内广告开户、投放流程和避坑攻略!
  • Qt插件Plugins
  • 【数据泄露】沙特知名零售公司客户信息遭泄露
  • 大语言模型稀疏水印技术
  • vue Ref 和 Reactive 原理解析
  • STM32智能家居控制系统教程
  • C语言实现三子棋
  • 【中项】系统集成项目管理工程师-第9章 项目管理概论-9.1PMBOK的发展与9.2项目基本要素
  • 机器学习之心一区级 | Matlab实现SMA-Transformer-LSTM多变量回归预测(黏菌算法优化)
  • 一个Spring Boot Web项目一些常用的配置点
  • DAY28-贪心
  • openGauss触发器详解
  • 昇思25天学习打卡营第XX天|Pix2Pix实现图像转换
  • Yarn 介绍
  • golang 发送GET和POST示例
  • JavaScript创建对象的四种方式
  • Linux链接文件
  • python学习笔记-类对象的信息
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 多线程 start 和 run 方法到底有什么区别?
  • 微信小程序:实现悬浮返回和分享按钮
  • 我感觉这是史上最牛的防sql注入方法类
  • 详解移动APP与web APP的区别
  • 消息队列系列二(IOT中消息队列的应用)
  • 写给高年级小学生看的《Bash 指南》
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • linux 淘宝开源监控工具tsar
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #define用法
  • #QT(QCharts绘制曲线)
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (26)4.7 字符函数和字符串函数
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C++20) consteval立即函数
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (ZT)薛涌:谈贫说富
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (九)信息融合方式简介
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET 材料检测系统崩溃分析
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net6+aspose.words导出word并转pdf
  • .NET是什么
  • .NET项目中存在多个web.config文件时的加载顺序
  • .NET学习教程二——.net基础定义+VS常用设置
  • @31省区市高考时间表来了,祝考试成功
  • [000-002-01].数据库调优相关学习