springboot easyexcel异步导出创建进度监听器
·
@HasPermission("sys_post_export")
public R export(SysPost post, Long[] ids) {
try {
// 1 创建任务
Long taskId = sysTaskService.createTaskInfo(post);
// 2 异步导出
ScpUser user = SecurityUtils.getUser();
sysPostService.asyncExportPost(taskId,user,post, ids);
return R.ok(taskId);
} catch (Exception e) {
e.printStackTrace();
return R.failed("创建导出任务失败: " + e.getMessage());
}
}
@Transactional(rollbackFor = Exception.class)
public Long createTaskInfo(SysPost post) {
String fileName = post.getFileName();
if(StringUtils.isBlank(fileName)){
fileName=System.currentTimeMillis()+".xlsx";
post.setFileName(fileName);
}
SysTaskDTO taskVo = SysTaskUtils.getSysTask();
taskVo.setTitle(fileName.substring(0, fileName.lastIndexOf(".")));
taskVo.setDownloadLink(fileName);
SysTask sysTask = new SysTask();
BeanUtils.copyProperties(taskVo, sysTask);
sysTask.setStatus(TaskStatusEnum.PENDING.getCode());
sysTask.setCreateTime(LocalDateTime.now());
sysTaskMapper.insert(sysTask);
Long taskId = sysTask.getId(); // System.currentTimeMillis();
taskMap.put(taskId, sysTask);
return taskId;
}
@Async("taskExecutor")
public void asyncExportPost(Long taskId,ScpUser user,SysPost post, Long[] ids) {
try{
//1 查询数据
//List<PostExcelVO> postList = this.listPost(post, ids);
//2 更新任务状态为处理中
sysTaskService.updateTaskStatus(taskId, TaskStatusEnum.PROCESSING.getCode(), null);
// 模拟大数据量处理时间
Thread.sleep(20000);
List<PostExcelVO> postList=new ArrayList<>();
for (int i = 0; i < 200000; i++) {
PostExcelVO postExcelVO = new PostExcelVO();
postExcelVO.setPostId(Long.valueOf(i));
postExcelVO.setPostName("岗位名称" + i);
postExcelVO.setPostCode("岗位标识" + i);
postExcelVO.setPostSort(i);
postExcelVO.setRemark("岗位描述" + i);
postExcelVO.setCreateTime(LocalDateTime.now());
postList.add(postExcelVO);
}
Integer total = postList.size();
String fileName = post.getFileName();
//3 数据写入excel
//创建进度监听器
//String filePath = "C:\\Users\\scp\\Downloads\\files\\local\\excel\\"+fileName;
String fileFullPath = properties.getLocal().getBasePath() + FileUtil.FILE_SEPARATOR + "post"+ FileUtil.FILE_SEPARATOR+fileName;
EasyExcel.write(fileFullPath, PostExcelVO.class).registerWriteHandler(new EasyExcelExportListener(taskId,total)).sheet("数据").doWrite(postList);
//4 文件上传
File file=new File(fileFullPath);
sysFileService.uploadFileByLocal(file, fileName, "", null, "30");
//5 更新任务状态为完成
sysTaskService.updateTaskStatus(taskId, TaskStatusEnum.COMPLETED.getCode(), null);
//6 发送消息
sysMessageService.sendTaskMsg(user,"【导出成功】");
} catch (Exception e) {
sysTaskService.updateTaskStatus(taskId, TaskStatusEnum.FAILED.getCode(), e.getMessage());
sysMessageService.sendTaskMsg(user,"【导出失败】");
log.error("导出岗位数据失败"+e.getMessage());
}
}
package com.shpl.scp.admin.config;
import cn.hutool.extra.spring.SpringUtil;
import cn.idev.excel.write.handler.AbstractRowWriteHandler;
import cn.idev.excel.write.handler.WriteHandler;
import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
import cn.idev.excel.write.metadata.holder.WriteTableHolder;
import com.shpl.scp.admin.api.entity.SysTask;
import com.shpl.scp.admin.service.SysTaskService;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Row;
@Slf4j
public class EasyExcelExportListener extends AbstractRowWriteHandler implements WriteHandler {
private Long taskId;
private Integer total;
public EasyExcelExportListener(Long taskId,Integer total){
this.taskId = taskId;
this.total = total;
}
@Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
//log.info("写入行数据后 relativeRowIndex = {}",relativeRowIndex);
if(relativeRowIndex%999==0 || total == (relativeRowIndex+1)){
// 在每一行数据写入后调用
SysTaskService sysTaskService = SpringUtil.getBean(SysTaskService.class);
SysTask sysTask = new SysTask();
sysTask.setId(taskId);
sysTask.setExecNum(relativeRowIndex+1);
sysTask.setTotalNum(total);
sysTaskService.updateById(sysTask);
}
}
}
更多推荐

所有评论(0)