Excel导出导入时使用POI遇到的BUG
我们日常工作中经常做一些数据的导入导出,应该经常使用POI导出导入插件,对应的应该会经常遇到一些相
关的Bug, 这里我将自己遇到的一些分享给大家,希望有所帮助!
问题
// 错误日志
org.apache.poi.poifs.filesystem.OfficeXmlFileException:
The supplied data appears to be in the Office 2007+ XML.
You are calling the part of POI that deals with OLE2 Office Documents.
You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
解决办法
首先看导入的excel 文件后缀名是否和接收对象一致,如果一致问题就在jar包依赖版本上面, 更换合适的版
本就能解决大部分问题。
问题
// 依赖冲突
java.lang.NoClassDefFoundError: org/apache/poi/xssf/streaming/SXSSFWorkbook
导致出现这个错误的原因是因为SXSSFWorkbook 这个对象,正常原因有可能是因为:
1、jar包中没有这个对象
2、依赖的jar包版本冲突
解决办法:
1、使用其他的对象来接受excel文件数据,以下是我所遇到的几类对象(不同版本的excel文档对应的不同对象)
HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook
2、使用新的jar包依赖
常见的几类对象对应的excel文件版本的数据量及相应问题
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;但是此种方式的局限就是导出
数据的行数最多为65535行,超出65536条后系统就会报错。此方式因为行数不足七万行所以一般不会发生内存不足
的情况;
XSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx;XSSFWorkbook最多可以导出104万行,不过
会伴随着一个问题,会出现OOM内存溢出;
SXSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx;对于大型excel文件的创建,关键问题就是
要确保不会内存溢出,SXSSFWorkbook会将数据写入到硬盘中,内存中会保存最新的row数据,不占用内存很少,
不会出现内存溢出等问题,面对大数据量的文件时建议使用SXSSFWorkbook。
当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。推荐用SXSSFworkbook。
想要了解更多关于三个对象的区别及优缺点可以去 https://www.cnblogs.com/skyislimit/articles/10514719.html
个人推荐依赖版本(以前使用3.8,现在使用4.1.2)
<!-- POI插件 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>