使用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页