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环境运行报错):
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):
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中增加插件:
<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环境中就没问题了!
特意记录,主要是解决问题的思想重要。。。。。。。。。。