获取excel中的图片(包含wps中嵌入单元格图片)

项目中有excel导入功能,并且需要导入excel中的图片;模板如图:

已知office中插入的图片为浮动形式;如图:

wps中可以插入浮动图片,也可以插入嵌入单元格图片;如图:

并且在wps嵌入单元格形式的图片可以看到使用的是公式;如图:

 问题来了,如何获取图片  并且将图片与单元格进行对应

浮动形式图片获取网上一搜一大把 不多说

主要说下wps如何将单元格和获取到的图片对应

开始分析:

已知这个图片公式中的图片ID是 ID_DAF859A2B4904BF7A304D49029CAD99C

poi方法可以获取到工作表中所有图片  那么问题来了 如何将图片和图片ID对应起来

poi中没有方法可以找到对应关系 

 开始找对应关系:

将excel文件改后缀为zip  并进行解压

解压后看到文件xl路径下有个cellimages.xml

 打开并格式化后内容如下:

 可以看到这个文件里面有图片ID的数据结构 但是又是如何和图片对应起来的呢

上面我们发现如果有图片ID和图片名称的对应关系 那么我们就能确定图片ID和代码中获取的图片对应关系,但是很遗憾 这里没有这个对应关系          接下来继续找

 我们发现在解压文件夹下xl\_rels有个cellimages.xml.rels 文件

打开文件并格式化后如下:

然后就可以找到对应关系了

 有了对应关系就可以开始撸代码了

接下来贴代码:

1.使用的依赖

 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.12.0</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.11.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.3.0</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>compile</scope></dependency><dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.34</version></dependency>

2.方法中传入代码中的图片公式 以及上传的文件 返回map类型

嵌入形式图片键为公式 浮动形式图片为起始单元格索引拼接字符串

方法中首先截取字符串 获取图片ID

 接下来获取xl/cellimages.xml文件中的rId和图片ID 

再接下来获取rId和图片名称对应关系

最后根据图片名称去对应工作表中获取到的图片

 就可以根据这个map去进行操作了

已将代码打包 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/40267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cat(3):客户端集成—简单案例

接下来编写一个简单的springboot与Cat整合的案例 1 新建springboot项目 首先创建一个Spring Boot的初始化工程。只需要勾选web依赖即可。 2 添加 Maven 添加依赖 <dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifa…

UE4/5Niagara粒子特效学习(使用UE5.1,适合新手)

目录 创建空模板 创建粒子 粒子的基础属性 粒子的生命周期 颜色 大小设置 生成的位置 Skeletal Mesh Location的效果&#xff1a; Shape Location 添加速度 添加Noise力场 在生成中添加&#xff1a; 效果&#xff1a; ​编辑 在更新中添加&#xff1a; 效果&…

机器学习线性代数基础

本文是斯坦福大学CS 229机器学习课程的基础材料&#xff0c;原始文件下载 原文作者&#xff1a;Zico Kolter&#xff0c;修改&#xff1a;Chuong Do&#xff0c; Tengyu Ma 翻译&#xff1a;黄海广 备注&#xff1a;请关注github的更新&#xff0c;线性代数和概率论已经更新完毕…

简述 TCP 和 UDP 的区别以及优缺点和使用场景?

一、TCP与UDP区别总结&#xff1a; 1、TCP面向连接&#xff08;如打电话要先拨号建立连接&#xff09;;UDP是无连接的&#xff0c;即发送数据之前不需要建立连接 2、TCP提供可靠的服务。也就是说&#xff0c;通过TCP连接传送的数据&#xff0c;无差错&#xff0c;不丢失&…

SQL Injection

SQL Injection 就是通过把恶意的sql命令插入web表单递交给服务器&#xff0c;或者输入域名或页面请求的查询字符串递交到服务器&#xff0c;达到欺骗服务器&#xff0c;让服务器执行这些恶意的sql命令&#xff0c;从而让攻击者&#xff0c;可以绕过一些机制&#xff0c;达到直…

Vue使用element-ui

main.js配置 //引入Vue import Vue from vue //引入App import App from ./App.vue//完整引入 //引入ElementUI组件库 // import ElementUI from element-ui; //引入ElementUI全部样式 // import element-ui/lib/theme-chalk/index.css;//按需引入 import { Button,Row,DatePi…

记一次前端直接上传图片到oss报错

前端直接上传图片到阿里云oss,相关过程官网和网上资料已经很详细&#xff0c;不做赘述。 但这个过程比较复杂&#xff0c;前后端对接过程中很容易出现报错&#xff0c;这里遇到了以下报错&#xff0c;不容易排查。 请求显示net::ERR_NAME_NOT_RESOLVED错误&#xff0c;catch输…

如何在windows电脑安装多个tomcat服务器和乱码问题

前提条件安装jdk 以17版本为例&#xff0c;将jdk8卸载干净 1.首先进入tomcat官网下载 tomcat网址 这里下载tomcat10为例子 1.1 这里选择方式一 下载解压版 2.解压后拷贝三份 分别命名为 8081、 8082、 8083 3.分别对每个tomcat执行以下操作 3.1 找到tomcat所在webapps文…

Flask框架-配置日志(1):flask使用日志

一、项目结构 study_flask --| apps/ --| __init__.py --| base/ --| logger.py --| __init__.py --| app.py 二、配置日志功能 1、base/logger.py import os import logging from datetime import datetime,date,timedelta from logging.handlers import RotatingFileHandl…

python 开启5个进程处理list数据

要在 Python 中开启多个进程来处理列表数据&#xff0c;你可以使用 multiprocessing 模块。下面是一个开启5个进程处理列表数据的示例代码&#xff1a; python import multiprocessingdef process_item(item):# 在这里处理每个列表项的逻辑print(f"Processing item: {ite…

LeetCode[56]合并区间

难度&#xff1a;Medium 题目&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&…

Android Studio Giraffe控制台乱码

这几天在使用Android Studio Giraffe进行一个App的开发&#xff0c;在项目构建的时候&#xff0c;控制台输出中文都是乱码&#xff0c;看着很不爽&#xff0c;进行了两项配置&#xff0c;中文就可以正常输出了&#xff0c;看起来就爽多了。 第一个配置&#xff1a;点击Help菜单…

Redis对象和五种常用数据类型

Redisobject 对象 对象分为键对象和值对象 键对象一般是string类型 值对象可以是string&#xff0c;list&#xff0c;set,zset,hash q&#xff1a;redisobj的结构 typedef struct redisObject { //类型 unsigned type:4; //编码 unsigned encoding:4; //指向底层实现…

webrtc Thread 和 TaskQueue 的 应用和思考

webrtc Thread 和 TaskQueue 的 应用和思考 Thread #include "rtc_base/thread.h"void FunctionToRunOnThread() {// Your threaded logic here.printf("Function running on the thread!\n"); }int main() {rtc::Thread* thread rtc::Thread::Create()…

WebService—XFire配置笔记

在学习之前,一直以为WebService就是一个工具,在两个服务器之间建立一个通信,帮我们把需要传输的数据组织成规范的XML数据并发送到目的地,实际情况也确实是这样的,不过更高级一点的是,XFire不但可以帮我们生成XML发送,而且可以在接收了xml之后还可以直接返回对象给我们用…

iptabels路由转发

要配置iptables进行路由转发&#xff0c;需要执行以下步骤&#xff1a; 确保系统已经开启了IP转发功能。可以通过执行以下命令来检查&#xff1a; sysctl net.ipv4.ip_forward如果返回的值为1&#xff0c;表示已经开启了IP转发功能。如果返回的值为0&#xff0c;可以通过执行…

神经网络基础-神经网络补充概念-29-为什么使用深层表示

概念 深层表示&#xff08;Deep Representation&#xff09;是指在深度神经网络的多个隐藏层中逐层提取和学习数据的特征表示。 使用深层表示的原因 高维特征提取&#xff1a;深层神经网络可以从原始数据中自动学习高维抽象特征。每个隐藏层都对数据进行一些变换&#xff0c…

“深入探索JVM内部机制:解密Java虚拟机的奥秘“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解密Java虚拟机的奥秘 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;介绍JVM的基本原理、运行时数据区域以及垃圾回收机制&#xff0c;并通过示例代码解释这些概念。 正文&am…

PG-DBA培训14:PostgreSQL数据库升级与迁移

一、风哥PG-DBA培训14&#xff1a;PostgreSQL数据库升级与迁移 课程目标&#xff1a; 本课程由风哥发布的基于PostgreSQL数据库的系列课程&#xff0c;本课程属于PostgreSQL备份恢复与迁移升级阶段之PostgreSQL数据库升级与迁移&#xff0c;学完本课程可以PostgreSQL数据库升…

炒股票怎么加杠杆_融资融券账户怎么开通

炒股票作为一种投资方式&#xff0c;可以带来不错的回报。然而&#xff0c;对于那些希望以较小的资金获得更高收益的投资者来说&#xff0c;加杠杆炒股票是一个值得考虑的选择。本文将为您介绍加杠杆炒股票的意义&#xff0c;以及如何开通融资融券账户。 加杠杆炒股票的意义&a…