java block报错图_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中增加插件:

org.apache.maven.plugins

2.6

maven-resources-plugin

UTF-8

xlsx //xlsx结尾的文件不

官网原话: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环境中就没问题了!

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值