需求背景
看标题又是一个变态的需求,但是实际业务场景中确实存在。
既然有需求那我们就得支持。
那么这种场景下如何使用asyncexcel进行异步导出呢?
在之前的文章中我们已经实现了分sheet导出不同业务的数据了
那么此时的场景似乎也差不多,对业务代码稍微改动下即可
案例描述
我们将操作日志按不同操作人分sheet导出
示例代码
注入excelService
@Autowired
ExcelService excelService;
controller代码
@RequestMapping("/dynamicSheetExports")
public Long dynamicSheetExports() {
DataExportParam<Oplog> param = new DataExportParam<>();
param.setExportFileName("导出测试");
//分页查询每次2条
param.setLimit(2);
Deque<String> conditionList=new ArrayDeque<>();
//此处可以对数据进行group by 之后获取到按sheet对相同数据分类的sheet页条件
//示例中以op_user为条件
conditionList.add("test");
conditionList.add("xxx");
conditionList.add("bbb");
Map<String,Object> map =new HashMap<>();
map.put("queue",conditionList);
//将参数设置给param;
param.setParameters(map);
//根据group 条件 放入多少个handler
Class[] handlerClass = new Class[conditionList.size()];
for (int i = 0; i < conditionList.size(); i++) {
handlerClass[i]=OplogExportHandle.class;
}
//多个sheet导出时,行数计算为所有sheet的总行数,顺序为传入数据组的顺序
Long taskId = excelService.doExport(param,handlerClass);
return taskId;
}
handler代码
@ExcelHandle
public class OplogExportHandle implements ExportHandler<OplogExportModel> {
@Autowired
IOplogService oplogService;
@Override
public void init(ExcelContext context, DataParam param) {
Map<String, Object> parameters = param.getParameters();
Deque queue = (Deque)parameters.get("queue");
String condition = (String)queue.pollFirst();
parameters.put("condition",condition);
ExportContext ctx = (ExportContext) context;
//此处的sheetNo会被覆盖,为了兼容多sheet
WriteSheet sheet = EasyExcel.writerSheet(0, condition).head(OplogExportModel.class).build();
ctx.setWriteSheet(sheet);
}
@Override
public void beforePerPage(ExportContext ctx, DataExportParam param) {
//啥也没有
}
@Override
public ExportPage<OplogExportModel> exportData(int startPage, int limit, DataExportParam param) {
IPage<Oplog> iPage = new Page<>(startPage, limit);
LambdaQueryWrapper<Oplog> queryWrapper = new LambdaQueryWrapper<>();
Map<String, Object> parameters = param.getParameters();
String condition = (String)parameters.get("condition");
queryWrapper.eq(Oplog::getOpUser, condition);
IPage page = oplogService.page(iPage, queryWrapper);
List<OplogExportModel> list = ExportListUtil.transform(page.getRecords(), OplogExportModel.class);
ExportPage<OplogExportModel> result = new ExportPage<>();
result.setTotal(page.getTotal());
result.setCurrent(page.getCurrent());
result.setSize(page.getSize());
result.setRecords(list);
return result;
}
}
过程描述
1、在controller中先查询要分多少个sheet,这里可以使用group by从数据库统计出来有多少种类型,然后将不同维度作为条件分割sheet数据,放到一个队列中,并将队列丢给入参map。
2、然后再handler中一个个弹出队列,作为一个维度,对应一个handler。当一个sheet执行完成后,执行下一个sheet ,需要重新声明一个sheet替换掉上下文中的sheet。