easy excel 实现分页批量导出

13 篇文章 1 订阅
5 篇文章 0 订阅

主要对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批量分页导出的工具类。

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值