使用Easy Poi导入Excel时特别慢
问题描述:
在使用easy poi导入一个5000多行的excel时特别慢,大概需要5~6分钟,经过查看源码,发现了问题并已经解决,现在记录一下
- 依赖
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>4.2.0</version>
</dependency>
使用的是4.2.0版本
- 源代码
这段代码的位置是ExcelImportService类中的ExcelImportResult importExcelByIs(InputStream inputstream, Class<?> pojoClass,
ImportParams params, boolean needMore)方法里的一段
if (needMore) {
InputStream successIs = new ByteArrayInputStream(baos.toByteArray());
try {
Workbook successBook = WorkbookFactory.create(successIs);
if (params.isVerifyFileSplit()){
importResult.setWorkbook(removeSuperfluousRows(successBook, failRow, params));
//慢的原因定位到这行代码
importResult.setFailWorkbook(removeSuperfluousRows(book, successRow, params));
} else {
importResult.setWorkbook(book);
}
importResult.setFailList(failCollection);
importResult.setVerifyFail(verifyFail);
} finally {
successIs.close();
}
}
- 解决思路
既然这行代码执行的特别慢,那么就想办法不执行这段代码,让params.isVerifyFileSplit()为false就可以了。
所以回到自己的代码里,将importParam里的VerifyFileSplit属性设置为false
贴一下自己的方法的一部分代码,加上params.setVerifyFileSplit(false);就可以了。
public ExcelImportResult<?> resolveExcel(MultipartFile files, Class<?> t) throws CustomerException {
log.info(">>>>> ready to resolve excel");
long start = System.currentTimeMillis();
//保存文件到指定的文件夹里, 并将 MultipartFile 转成File
File file = saveFile(files, t, null);
ImportParams params = new ImportParams();
params.setStartRows(0);
//设置1,就遍历到第一行结束,如果设置2,就遍历到第二行结束
params.setHeadRows(1);
params.setNeedVerify(true);
//返回文件是否分割
params.setVerifyFileSplit(false);
params.setVerifyGroup(new Class[]{ViliGroupOne.class});
//设置自定义的校验规则
setRuleByClass(t, params);