1.主体代码
public List<ImportPurviewVo> importPurview(AddProdPurviewDto dto) {
List<ImportPurviewVo> dataList = new ArrayList<>();
File tempFile = null;
String exceUrl = dto.getExcelUrl();
if (StrUtil.isEmpty(exceUrl)) {
throw new APIException(ResultCode.ERROR, "请传入文件!");
}
String suffix = Objects.requireNonNull(exceUrl).substring(exceUrl.lastIndexOf(".") + 1);
if (StrUtil.isEmpty(suffix) || !Arrays.asList("xls", "xlsx").contains(suffix)) {
throw new APIException(ResultCode.ERROR, "文件格式错误");
}
try {
String excelUrl = dto.getExcelUrl();
// 下载远程 Excel 文件到临时目录
URL url = new URL(excelUrl);
URLConnection connection = url.openConnection();
InputStream inputStream = connection.getInputStream();
//创建临时文件
tempFile = File.createTempFile("tempExcel", ".xlsx");
FileUtils.copyInputStreamToFile(inputStream, tempFile);
DemoDataListener demoDataListener = new DemoDataListener();
EasyExcel.read(tempFile, ImportPurviewVo.class, demoDataListener).excelType(ExcelTypeEnum.XLSX).sheet().doRead();
dataList = demoDataListener.getDataList();
} catch (Exception e) {
log.error("importPurview error msg = {} " + e.getMessage());
} finally {
// 删除临时文件
if (tempFile != null && tempFile.exists()) {
tempFile.delete();
}
}
return dataList;
}
2.监听器(可以更好的去避免oom问题)
@Slf4j
@Data
public class DemoDataListener implements ReadListener<ImportPurviewVo> {
private static final int BATCH_COUNT = 3000;
/**
* 是否是第一条 用来去掉表头数据
*/
private boolean IS_FIRST = true;
/**
* 缓存的数据
*/
private List<ImportPurviewVo> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
/**
* 这个每一条数据解析都会来调用
*
* @param data
* @param context
*/
@Override
public void invoke(ImportPurviewVo data, AnalysisContext context) {
if (IS_FIRST){
IS_FIRST = false;
return;
}
cachedDataList.add(data);
// 达到BATCH_COUNT了,防止数据几万条数据在内存,容易OOM
log.info("ImportPurview read:{}",data);
if (cachedDataList.size() >= BATCH_COUNT) {
throw new APIException(ResultCode.ERROR,"一次性最多导入3000条数据");
}
}
/**
* 所有数据解析完成了 都会来调用 这里可以用来做保存到数据库功能
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
// saveData();
}
/**
* 返回list
*/
List<ImportPurviewVo> getDataList() {
return cachedDataList;
}
}
3.使用到的依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>