maven项目下上传xlsx文件成inputstream流后用WorkbookFactory转换报错

maven项目下上传xlsx文件成inputstream流后用WorkbookFactory转换报错
强烈推介IDEA2021.1.3破解激活,IntelliJ IDEA 注册码,2021.1.3IDEA 激活码  

大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说maven项目下上传xlsx文件成inputstream流后用WorkbookFactory转换报错,希望能够帮助大家进步!!!

因为java项目需要因此需要

  • html提交xlsx文件
  • controller层能接受MultipartFile文件,并转换成inputstream流扔给business(service)层处理
  • business(service)层将xlsx的信息全部获取并返回到前台

但是在前台上传xlsx文件时,返回信息时一直提示 500,即提示服务器内部错误。
于是在断点的情况下,博主确认controller能接收MultipartFile文件并能转换成inputstream流,但是在inputstream使用poi包下的WorkbookFactory转换时会报错。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

java.lang.NoClassDefFoundError: org/openxmlformats/schemas/spreadsheetml/x2006/main/CTDxfs$1
....

未捕获到 servlet OUTEXCEL 的其中一个服务方法中抛出的异常。抛出的异常:java.lang.NoClassDefFoundError: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFileRecoveryPr

at java.lang.J9VMInternals.verifyImpl(Native Method)

at java.lang.J9VMInternals.verify(J9VMInternals.java:59)

at java.lang.J9VMInternals.initialize(J9VMInternals.java:120)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:67)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:521)

at org.apache.xmlbeans.impl.schema.SchemaTypeImpl.createUnattachedNode(SchemaTypeImpl.java:1859)

at org.apache.xmlbeans.impl.schema.SchemaTypeImpl.createTypeStoreUser(SchemaTypeImpl.java:1805)

at org.apache.xmlbeans.impl.store.Xobj.setStableType(Xobj.java:1390)

at org.apache.xmlbeans.impl.store.Cur.setType(Cur.java:2497)

at org.apache.xmlbeans.impl.store.Cur.setType(Cur.java:2482)

at org.apache.xmlbeans.impl.store.Locale.newInstance(Locale.java:630)

at org.apache.xmlbeans.impl.store.Locale.newInstance(Locale.java:606)

at org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.newInstance(SchemaTypeLoaderBase.java:198)
...

//并且具体错误提示在 workbook wb =  WorkbookFactory.create(file.getinputStream());

于是错误排查:

查阅诸多资料了解到,处理xlsx文件出错大多由于以下原因:

  • 1.文件过大,jvm内存不足。

这个问题可以通过在tomcat启动的时候调整jvm相关的数值得到缓解。

  • 2.大多数网友使用的是XSSWorkbook或者HXSSFWorkbook来处理文件流,这两者都有缺陷,前者只能处理xlsx文件,后者只能处理XLS文件。

因此推荐使用workbookfactory,这个函数两种格式的excel都能处理,减少了不必要的判断 ,并且后续操作是相同的。

  • 3.导包不正确(正是博主出现的问题)
    在这里插入图片描述
    正常情况下,需要导入三个包:poi,poi-ooxml,poi-ooxml-schemas。
  • (1)首先这三个包的版本必须一致,不然会出现报错现象。
  • (2)但是博主的三个包版本一致的前提下仍旧出现错误,排查发现

经过确认,是由于poi使用的poi-ooxml-schemas是ooxml-schemas的精简版,所以导出Excel可能会报错,tomcat下面使用前者是没有问题的,此时需要统一jar包版本为ooxml-schemas.1.1.jar,这个ooxml-schemas有两个版本的jar包,一个是 POI 3.7,之前版本使用的ooxml-schemas-1.0.jar.另一个就是poi3.7以后版本使用的ooxml-schemas-1.1.jar,官网也说了这个问题:http://poi.apache.org/faq.html#faq-N10025.

在替换了包之后成功运行解决问题。

本文来源GroovRain,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/25362

发表评论