Poi读取Excle报错 java.util.zip.ZipException: invalid stored block lengths
一:Poi读取Excle报错 java.util.zip.ZipException: invalid stored block lengths
系统中需要导出excle签收单,excle模板是预设好放在classpath下的(idea中resources目录),程序运行的时候,利用类加载器从classpath读取文件读成BufferedInputStream,然后利用 inputStream 实例化XSSFWorkbook对象
代码如下(web环境运行报错):
1 2 3 | InputStream inputStream = this .getClass().getClassLoader().getResourceAsStream(EXCEL_TEMPLATE); //此处从classpath下获取源文件,在web环境中所有的源文件都是被压缩在war包下的 XSSFWorkbook workbook = new XSSFWorkbook(inputStream ); //此处报错: java.util.zip.ZipException: invalid stored block lengths |
关于poi读取excle的操作,在单元测试是没问题的!至于单元测试和正式代码的区别是单元测试是绝对路径获取文件,再将文件转化为fileinputstream,再用这个input实例化XSSFWorkbook对象。
代码如下(单元测试环境运行ok):
1 2 3 4 5 | File fileTemplate = new File( "D:/workspace/template.xlsx" ); //可以看见此处是绝对路径获取源文件 // 转化流 FileInputStream is = new FileInputStream(fileTemplate); // 创建工作簿 XSSFWorkbook workbook = new XSSFWorkbook(is); //此代码运行ok |
观察上述2段代码可发现,区别在于2 点,1):流的类型不同,2):一个源文件是被压缩,一个是没有被压缩
关于流类型不同这个点 ,实例化 XSSFWorkbook 对象 接收的参数 是 inputstream 这个抽象类的实例 ,而上述2段代码的流都是继承inputstream ,根据多态的思想,上述2段代码的入参都没问题!
那么问题产生的可能的原因就是 一个源文件是被压缩,一个是没有被压缩 了,毕竟报错信息是: java.util.zip.ZipException: invalid stored block lengths(无效的存储块的长度) 可能和压缩打war包有关,
于是我将war包解压,尝试打开classpath下的excle文件,发现打不开,文件损坏!
于是基本确定是maven install 打包的时候 导致文件压缩不可用的原因了!
于是maven中增加插件:
1 2 3 4 5 6 7 8 9 10 11 | <plugin> <groupId>org.apache.maven.plugins</groupId> <version> 2.6 </version> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF- 8 </encoding> <nonFilteredFileExtensions> <nonFilteredFileExtension>xlsx</nonFilteredFileExtension> //xlsx结尾的文件不 </nonFilteredFileExtensions> </configuration> </plugin> |
官网原话:To prevent corrupting your binary files when filtering is enabled, you can configure a list of file extensions that will not be filtered.
链接:https://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html
如此配置在web环境中就没问题了!
特意记录,主要是解决问题的思想重要。。。。。。。。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)