easy excel 实现分页批量导出

主要对easyExcel做了易用性的封装,需要导出的话,就继承这个类。

@Log4j2
public class EasyExcelBaseController<T> {
          
   

    /**
     * 导出时候 获取某一页的数据.
     */
    protected List<T> getExportPageData(Object condtion, int current ,int  size){
          
   
        return null;
    }

    /**
     * 导出excel
     */
    public void exportExcel(Object condtion,HttpServletResponse response,Class<T> realT, String fileName_en,String fileName_zh,List<String> excludeColumnList){
          
   
        long startTime = System.currentTimeMillis();
        log.info("export {} file start ",fileName_en);

        ExcelWriter excelWriter = null;
        try {
          
   
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode(fileName_zh, "UTF-8").replaceAll("\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8" + fileName + ".xlsx");

            excelWriter = EasyExcel.write(response.getOutputStream(), realT).excludeColumnFiledNames(excludeColumnList).build();
            WriteSheet writeSheet = EasyExcel.writerSheet(1).build();

            int current = 1;
            List<T>  exportDatas = null;
            while (true){
          
   
                //分页查询
                exportDatas = getExportPageData(condtion,current,TmsSystemConfig.BATCH_EXPORT_NUM);

                //根据数据导出excel
                if(exportDatas.size() > 0){
          
   
                    excelWriter.write(exportDatas, writeSheet);
                }

                if( exportDatas.size() < TmsSystemConfig.BATCH_EXPORT_NUM){
          
   
                    break;
                }
                //还有数据 继续查询
                current++;
            }
        } catch (Exception e) {
          
   
            log.error("export excel {} error error list:{}",fileName_en);
            log.error("export excel error error list:{}",e);
        }finally {
          
   
            //一定要关掉
            if(excelWriter != null){
          
   
                excelWriter.finish();
            }
        }
        long endTime = System.currentTimeMillis();
        log.info("export {} file end , total use time :{} ",fileName_en,endTime-startTime);
    }
    
}

现在,我们就可以继承这个EasyExcelBaseController类,然后实现导出了,如下

public class UserExcelController extends EasyExcelBaseController<UserVO> {
          
   

    private UserFeignApi userFeignApi;
    /**
     * 导出用户列表excel
     */
    @GetMapping("/export")
    @ApiOperation(value = "导出excel", notes = "导excel")
    public void exportExcel(UserExportDTO dto, HttpServletResponse response) {
          
   
        super.exportExcel(dto, response, UserVO.class,"userList","用户导出列表",null);
    }

    /**
     * 查询导出的分页数据的某一页数据
     */
    @Override
    public List<UserVO> getExportPageData(Object condtion, int current, int size){
          
   
        UserExportDTO dto = (UserExportDTO ) condtion;
        List<UserVO> list = new ArrayList<>();
        R<Page<UserVO>> ret = userFeignApi.selectPage(dto,current,size);
        if(ret != null && ret.getData() != null){
          
   
            if(ret.getData().getTotal() > TmsSystemConfig.BATCH_EXPORT_MAX_NUM){
          
   
                throw new ServiceException("导出数据过多,超过最大值,请优化查询条件,缩小数据范围!");
            }
            list = ret.getData().getRecords();
        }
        return list;
    }
}

这样就实现了,一个很好用的easyExcel批量分页导出的工具类。

经验分享 程序员 微信小程序 职场和发展