2020-12-10

使用EasyPOI的大批量导出数据demo

 

最近在使用Excel做数据导出的时候,遇到各种各样的问题,在使用原生的poi的时候,发现导出的数据量大,会发生内存溢出的情况,并且器导出的速度极其的慢慢慢慢,于是不能仅仅局限于原生POI,在专用api度娘的帮助下, 发现了两个比较牛叉的Excel操作框架,分别为EasyExcel和EasyPoi,两者对Excel大数据量的导出,都做了比较好的分装,楼主这里使用EasyPOI进行数据导出,官网地址:https://gitee.com/lemur/easypoi?_from=gitee_search  官方文档地址: http://doc.wupaas.com/docs/easypoi/easypoi-1c0u4mo8p4ro8 细细研究,官网给了好多的demo,但是在第一次使用的时候还是会遇到各种坑。

本文给出了EasyPoi的两种版本的导出方式,本来楼主使用了4.2版本,奈何4.2版本时不时的出现一个问题(下面介绍),从4.2降到了3.2,降完之后还真的没有再次出现那个问题,在此记录一下,希望有碰到的小伙伴可以避免一下。4,2跟3.2导出的方式不一样 ,所以使用了两种方式:

首先上3.2

对应实体类:

@Data
public class User{
  @Excel(name = "用户名" orderNum = "1")
  String userName;
  @Excel(name = "密码" orderNum = "2")
  Stirng password;
  @Excel(name = "电子邮箱" orderNum = "3")
  String Email;
  @Excel(name = "电话" orderNum = "4")
  String tel;
}

对应Controller

@GET
@Paht("/exportExcel")
public void ExportExcel(@QueryParam("userName") String username,@QueryParam("password") String password,@Context HttpServletResponse response){
 DateFormat dateFormat = new DateFormat("yyyy-MM-dd");
 String date = dataFormat.format(new Date());
 ExportParams exportParam = new ExportParams("用户信息表",date,"sheet");
 //map 为查询条件  视情况使用
 HashMap MAP = new HashMap();
 map.put("username",username);
 map.put("password",password);
 Workbook workbook = service.getListExcelWorkBook(1,map,null,exportParam);
 writeResponse(response,workbook);
}


private writeResponse(HttpServletResponse response,Workbook workbook){
 response.setCharacterEncoding("utf-8");
 response.setContentType("application/x-download");
 response.setHeader("Content-Disposition","attachment;filename=信息表.xlsx");
 try(OutputStream output = response.getOutputStream()){
   workbook.write(outputStream);
   outputStream.flush();
}

}

ServiceImpl

@Service
public class ExportServiceImpl implements ExportService{
  
@AutoWried
private ExportMapper exportMapper;  
/***
**采用分页的方式将数据查询出,写到workbook中
**/

public WorkBook getExcelListWorkBook(int pageNum,Map<String,Object> params,Workbook workbook,ExportParam exportParms){
   int size = 10000;
   PagerHelper.startPage(pageNum,size);
   List list = exportMapper.getListExcel(username,password);
   PageInfo<User> pageInfo = new PageInfo<User>(list);
   List result = pageInfo.getRows();
   workbook = ExcelExportUtil.exportBigExcel(exportParam,User.class,result);
  /**
  *递归查询,totalPageNum 为总共的分页数量
  */
 if(pageNum < = totalPageNum){
   getExcelListWorkBook(pageNum+1,params,workbook,exportParams);
  
 }
  return workbook;
   
}


}

剩下的Mapper 跟Serivice 跟普通的查询同一个写法,使用PageHelper进行分页。。。。

easypoi4.2

  4.2修改了3.2导出excel的方式,比3.2更方便简单,但是,会时不时的抱一个错误(经过专用api查询,应该是poi自身的bug 我也没找到什么具体的解决方案,所以将版本进行了降级),

@AutoWried
private ExcelExportService exexcelExportService;

WorkBook worbook = ExcelExportUtil.exportExcel(exportParams,User.class,excelExportService,map);

/**
*接下来的操作 跟3.2操作一样
**/

ExcelExportService 集成IExcelExportServer

public interface ExcelExportService extends IExcelExportServer{
}

ExcelExportServiceImpl

public class ExcelExportServiceImpl implements ExcelExportService{
  @AutoWired
  private Service service;

  public List<Object> selectListForExcelExport(Object o,int page){
    Map map = (Map) o;
    PageInfo pageInfo = service.getListForExcel(map.get("username"),map.get("password"), 
    (pageNum - 1 )*10000,10000);
    List list = pageInfo.getRows();
    return list;
}


}

分页导出10000为1页

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值