事件起因
报错内容(我主要搜索的两个错误内容点):
com.alibaba.excel.exception.ExcelGenerateException: Create workbook failure
和
Caused by: org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) file
以及
Caused by: java.util.zip.ZipException: Unexpected record signature: 0X44535425
报错具体内容内容:
错误描述:我要下载的模板文件放在了后端的服务器上,通过前端点击按钮,后端将excel文件读取并写入到流中返回给前端下载,每次用easyExcel的build时就会报错,所以我也在找原因
点击下载按钮也能下载,但是打开文件就是这个内容:
环境和工具
idea 2021.1.1
webstorm 2022.2.2
mysql 5.7
操作过程
首先easyExcel的依赖一开始我看到用的是2.2.10版本的,我去easyExcel的官方文档里也找了读取模板文件的范例,发现写法是一样的,在官方文档里的3.x版本和2.x版本的读取模板文件的方式也是一样的,当时我也就没有改这个版本号(这是一个老项目,我只能在老项目的基础上进行修改,尽量少动它的东西)
我发现也不是我的文档被加密等情况(虽然电脑确实安装了公司加密软件,但这个文档我看到确实还没有加密,该情况排除)
小小的发现:
一开始我以为是下面参考内容里面的增加依赖那篇文章里面的内容,仿造他的方法对我的这个进行了改造,但是出现了一个更离谱的情况,更新依赖启动项目后第一次下载没问题,但后面的下载就出现问题了,不管系统重启多少次都没有用(不过已经出现能下载的情况了,那么说明方向没有错,就是依赖导致的)
网上搜索的这个错误:Caused by: org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) file
最后的矛盾都指向poi这个依赖,大致方向可以确定下来了,然后在网络上考看到一个去除部分依赖的情况,然后根据这个方式尝试了一下就成功解决了
原来的在External Libraries里面找已经下载的poi依赖:
上面的导入easyexcel的依赖时去除了本身自带的poi依赖,但是libraries中 却还是有着poi的依赖,说明pom.xml文件中单独导入了这个poi的依赖的:
在往下翻找的过程中确实也找到了这个poi,版本号与libraries里的相同,那就是这个了,应该是没有使用easyexcel版本里使用的poi所以导致有一些问题,于是先把这两个单独引入的依赖给注释掉,并把easyexcel排除的poi给导入进来 更新依赖后发现2.2.10版本的easyexcel的poi是下面这个版本的:
然后我重启项目,系统又报了一些莫名其妙的错误(应该是代码里面的其他地方有使用更高版本的poi里面的内容,2.2.10版本easyexcel里的3.17的poi版本有些低了,有些功能可能没有),于是我更新了easyexcel的版本到最新版3.1.0 该版本的easyexcel使用的poi版本也发生了相应的变化(easyexcel 3.1.0使用的是4.1.2版本的poi与原来手动导入的4.1.0相差不大,能够向下兼容)
然后再重启项目,我的项目就启动成功了。
之后我下载的模板也就没有问题了
解决办法
大致的解决办法就是easyexcel他本身有使用默认版本的poi,但是这个项目里,他手动排除掉了easyexcel版本的poi,然后又自己单独引用了一个4.1.0版本的poi,版本的差异过大导致的错误,我去除了他单独导入的poi包,升级了easyexcel更高版本的(且版本的这个写入模板的代码写法相同),这个更高版本的poi使用的是4.1.2版本的poi,原手动导入的poi版本是4.1.0,相差不大,项目正常启动运行
当遇到这个报错时:
Caused by: java.util.zip.ZipException: Unexpected record signature: 0X44535425
初看是压缩报错了,那么在target路径里的文件多半被加密了,公司的加密软件发挥了作用。如下图:
参考内容:
在网上也翻遍了很多的解决办法,有说公司软件把那个文档给加密的,也有说依赖有问题的,还有说依赖冲突的
在解决之后笔者觉得笔者遇到的这个问题应该属于依赖冲突
文档被加密:https://blog.csdn.net/shujuku____/article/details/122495782
增加依赖:https://blog.csdn.net/notfound4043/article/details/123882230
依赖冲突:https://www.jianshu.com/p/416059406264
对了还有一种情况说的是:可能你的流没有关闭!!在使用了inputStream后,结束时inputStream.close()这个记得调用一下
结束语
若是对你有所帮助的话,希望能获得你的 点赞、评论、收藏,这将是对我很大的鼓励!!! 这对我真的很重要!!!
蟹蟹٩(‘ω’)و