天天看点

asyncexcel按类型分sheet导出相同数据

需求背景

看标题又是一个变态的需求,但是实际业务场景中确实存在。

既然有需求那我们就得支持。

那么这种场景下如何使用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。

效果展示

asyncexcel按类型分sheet导出相同数据
asyncexcel按类型分sheet导出相同数据
asyncexcel按类型分sheet导出相同数据