zoukankan      html  css  js  c++  java
  • 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环境中就没问题了!

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

    基础决定深度啊!
  • 相关阅读:
    15行CSS代码攻击会导致 iOS 系统重启或 Mac 冻结
    css3特效_CSS3弹跳Loading加载动画特效的实现
    Web前端设计排版小技巧
    webpack配置sass模块的加载
    前后端分离项目的跨域及保持Session会话
    css盒子模型_css全局设置border-box
    大厂前端推荐纯css实现气泡效果
    前端开发常用css动画代码
    VSCode调试网页JavaScript代码
    HTML连载77-3D播放器
  • 原文地址:https://www.cnblogs.com/YJZUUID/p/9295241.html
Copyright © 2011-2022 走看看