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 环境中就没问题了!

 

特意记录,主要是解决问题的思想重要。。。。。。。。。。