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

Java读取WPS excel.xlsx嵌入图片

1. 背景&原因

经常有读取Excel文件的需求,开发者大多使用apache poi或者基于此的工具进行excel内容读取,前不久遇到了一个需求,读取每一行内容,但每一行都包含图片文件,发现无法通过已封装的工具读取excel的图片内容。
经过研究分析改excel文件为WPS编辑的excel文件,wps编辑的excel文件插入的图片有嵌入类型,使用的wps自己实现的私有函数,office的excel软件对此函数不支持,所以一方面office打开这样的文件图片就会显示成如下:
在这里插入图片描述
另外一方面achae poi是基于office的协议实现的excel内容读取,自然就不支持wps编辑的嵌入图片读取。

2. 解决方案

解决方案有两种,第一种在wps编辑的时候改变图片的插入方式改为浮动,自然就是和标准的office兼容的,apache poi相关的工具就能够读取了。
另外一种,如果一定要读取wps私有实现的嵌入图片,那么请继续往下看。
首先我们知道不管是word,excel还是ppt文件本质上就是一个zip的压缩包,里面有个许多xml格式的文件保存相关的信息,思路就是我们可以把wps编辑的.xlsx文件当做zip包解压缩,然后去找图片文件的存储位置,再结合相关的xml配置文件对应文件和单元格的关系就能够提取出wps格式excel嵌入图片了。
直接给大家说结果吧,下图是wps的excel文件解压后的目录, xl/media里面存储的图片文件,xl/cellimages.xml和_rel/cellimages.xml.rels这两个文件存储的是xl/media下的图片文件和表格单元格的对应关系。
从xl/cellimages.xml可以拿到name="ID_551876A0BB4341C480237B706FE48328" r:embed="rId1" 这两个参数很重要, name就对应了上面那个图中单元格的内容DISPIMG("ID_551876A0BB4341C480237B706FE48328",1) ,这个内容是可以通过apache poi当做普通文本读取出来的, 而r:embed="rId1"则是对应了xl/_rel/cellimages.xml.rels中的Relationship标签的Id字段,通过这个对应关系,获取Relationship 的Target值,可知此单元格存储的是media/images1.png。

<!-- xl/cellimages.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<etc:cellImages xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
                xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
                xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"
                xmlns:etc="http://www.wps.cn/officeDocument/2017/etCustomData">
    <etc:cellImage>
        <xdr:pic>
            <xdr:nvPicPr>
        
                <xdr:cNvPr id="39" name="ID_551876A0BB4341C480237B706FE48328"/>
                <xdr:cNvPicPr>
                    <a:picLocks noChangeAspect="1"/>
                </xdr:cNvPicPr>
            </xdr:nvPicPr>
            <xdr:blipFill>
                <a:blip r:embed="rId1"/>
                <a:stretch>
                    <a:fillRect/>
                </a:stretch>
            </xdr:blipFill>
            <xdr:spPr>
                <a:xfrm>
                    <a:off x="4676775" y="752475"/>
                    <a:ext cx="7791450" cy="12954000"/>
                </a:xfrm>
                <a:prstGeom prst="rect">
                    <a:avLst/>
                </a:prstGeom>
                <a:noFill/>
                <a:ln w="9525">
                    <a:noFill/>
                </a:ln>
            </xdr:spPr>
        </xdr:pic>
    </etc:cellImage>
</etc:cellImages>


<!-- xl/_rel/cellimages.xml.rels -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
    <Relationship Id="rId1" 
                  Target="media/image1.png"/>

</Relationships>

在这里插入图片描述
通过这种方式就可以获取了wps的内容了。

3. 附上第二种方式的代码


http://www.kler.cn/a/397116.html

相关文章:

  • xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer
  • Java爬虫(HttpURLConnection)详解
  • react 中 useCallback Hook 作用
  • GitHub新手入门 - 从创建仓库到协作管理
  • 『VUE』27. 透传属性与inheritAttrs(详细图文注释)
  • NVMe(Non-Volatile Memory Express)非易失性存储器访问和传输协议
  • 达梦数据库迁移j脚本
  • 24 年第十届数维杯国际数模竞赛赛题浅析
  • 【启明智显分享】5G CPE为什么适合应用在连锁店中?
  • 信捷PLC转以太网连接电脑方法
  • Dart:字符串
  • centos7 安装rabbitMQ3.7.15
  • HarmonyOS Next星河版笔记--界面开发(5)
  • 微信小程序之轮播图
  • 这个 AI 懂 Vue 吗?
  • YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10、YOLOv11 推理的 C++ 和 Python 实现
  • g++与gdb简单学习
  • git常用命令+搭vscode使用
  • 【云岚到家】-day10-2-冷热处理及统计
  • mp4文件与dash流传输
  • 5. langgraph中的react agent使用 (从零构建一个react agent)
  • 2个word内容合并
  • Go语言24小时极速学习教程(四)MySQL数据库的增删改查
  • 求矩阵中最小元素及其位置
  • 区块链安全性解析:Web3的去信任化与技术挑战
  • SpringBoot多环境+docker集成企业微信会话存档sdk