问题:导入一个excel,实现实时进度条的效果
思路:
easyExcel可以获取到excel的总条数,读每一行时存redis,当前条数+1,前端每3秒调用获取redis中的进度数据
代码:
private void parseExcelAndSave(MultipartFile file, Integer approvalType, Integer type,
Integer fixedSalaryBatchType, String originId, String requestId) throws Exception {
EasyExcel.read(file.getInputStream(), FixedsalaryEmployeeBatchExtPO.class, new ReadListener<FixedsalaryEmployeeBatchExtPO>() {
String redisKey = "importExcel:progressBar:"+ SecurityUtils.getLoginUser().get().getId();
@Override
public void invoke(FixedsalaryEmployeeBatchExtPO fixedsalaryEmployeeBatchExtPO, AnalysisContext analysisContext) {
try {
//TODO:必填字段校验
Integer rowCount = analysisContext.readSheetHolder().getApproximateTotalRowNumber()-3;
progressBarHandle(redisKey,rowCount);
//保存
saveEmployee(fixedsalaryEmployeeBatchExtPO,originId,requestId);
} catch (Exception e) {
redisCacheUtils.delete(redisKey);
log.error(e.getMessage(),e);
throw new WebServiceException(e.getMessage(),e);
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
redisCacheUtils.delete(redisKey);
}
}).headRowNumber(3).sheet().doRead();
}
/**
* 进度条处理
* @param redisKey
*/
private void progressBarHandle(String redisKey, Integer rowCount) {
String jsonStr = redisCacheUtils.get(redisKey);
JSONObject jsonObject = null;
if(ValidateUtil.isExist(jsonStr)) {
jsonObject = JSONUtil.parseObj(jsonStr);
Integer rowIndex = jsonObject.getInt("rowIndex");
rowIndex += 1;
jsonObject.put("rowIndex", rowIndex);
jsonObject.put("rowCount", rowCount);
} else {
jsonObject = new JSONObject();
jsonObject.put("rowIndex", 1);
jsonObject.put("rowCount", rowCount);
}
redisCacheUtils.add(redisKey, jsonObject, 30, TimeUnit.MINUTES);
}
redis获取进度数据
@Override
public String getProgressBar() {
String redisKey = "importExcel:progressBar:"+ SecurityUtils.getLoginUser().get().getId();
String value = redisCacheUtils.get(redisKey);
String valueStr = String.format("进度条bar:value: %s",value);
log.info(valueStr);
return value;
}