easyexcel异常类_easyexcel--解决poi大文件发生OOM问题

问题复现

工作中,项目里的导入功能采用了poi读取然后进行业务操作,在导入50M文件时发生了OOM报错信息,以下是本地复现的错误信息(由于环境不一样,本地导入14M的文件就已出现错误)

究其原因

项目中使用WorkBook这个类处理文件,这会先把文件中cell读到内存当中,当数据量比较大的时候就会产生java.lang.OutOfMemoryError: Java heap space错误。

看一下导入过程中内存的消耗情况

可以看出,导入过程内存消耗越来越大,直至抛出异常

easyExcel解决

核心原理

easyExcel是阿里的一个开源项目,可以解决内存消耗大的问题,主要因为解决了3个问题:

1.文件解压和读取的方式是通过文件的形式,不再是poi的内存形式

2.使用sax模式一行一行的读取,不将数据全部加载到内存中

3.抛弃了不重要的数据,比如字体宽度大小等格式。

性能测试

以上都是官网上的说法,不能只听他吹,实际测试一下到底读取大文件时会不会内存溢出,为了简单,只是读取数据,并没有业务逻辑

代码准备

@RestController

@RequestMapping("easyExcel")

public class TempEasyExcelController {

private static final Logger logger = LoggerFactory.getLogger(EasyExcelController.class);

@Autowired

private TempEasyExcelService easyExcelService;

@PostMapping("impExcel")

public String importExcel(MultipartFile file) {

long start = System.currentTimeMillis();

try {

easyExcelService.importExcel(file.getInputStream());

logger.info("文件大小:{}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用EasyExcel过程中,可能会遇到各种异常。常见的及其解决方法如下: 1. java.lang.NoSuchMethodError: org.apache.poi.ss.usermodel.Workbook.getSpreadsheetVersion()Lorg/apache/poi/ss/usermodel/SpreadsheetVersion; 这个错误是由于EasyExcel依赖的POI版本过低导致的,需要将POI的版本升级到4.0.1及以上。可以在pom.xml文件中将poi的版本改为: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> ``` 2. java.lang.ClassNotFoundException: com.alibaba.excel.exception.ExcelAnalysisException 这个错误是由于没有引入EasyExcel的依赖导致的,需要在pom.xml文件中加入以下依赖: ``` <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version> </dependency> ``` 3. com.alibaba.excel.exception.ExcelAnalysisException: Unsupported file format, expected xls or xlsx but got UNKNOWN 这个错误是由于文件格式不正确导致的,EasyExcel只支持xls和xlsx格式的文件,如果使用其他格式的文件会出现此错误。 4. java.lang.IllegalStateException: Cannot find field 这个错误是由于实体类的字段与Excel中的列名不匹配导致的,需要将实体类的字段名改为Excel中的列名或者使用@ExcelProperty注解来指定实体类的字段和Excel中的列名对应关系。 5. java.lang.IllegalStateException: Cannot read more than one sheet 这个错误是由于Excel中有多个Sheet导致的,EasyExcel默认只读取第一个Sheet,如果需要读取其他Sheet需要指定Sheet名称或者索引。 以上是常见的EasyExcel异常及其解决方法,希望能帮助到大家。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值