大数据量导出心得 SXSSFWorkbook
程序员文章站
2022-07-13 15:30:24
...
一开始做导出excel我是拒绝的。但是前端人员说会加特效duang,duang的。于是我认识了SXSSFWorkbook。
开始做导出使用的poi的标准写法。可是随着真实数据的海量降临,先是jvm内存溢出。这让人很头疼,于是我转换了一个思路。数据不一次性查出来就不会溢出了,于是我为数据查询做出分页查询。再逐次放入poi的 Sheet 里面。本想着问题就这样被我简单解决了。可是内存又溢出了。这次是poi的内存溢出。
抱着,内事不决为百度心态在网上找了很多资料。后来真的让我找到了 SXSSFWorkbook 专门导出excel大量数据而存在的。它会将你设置的超出行数的数据放入磁盘中,拒绝了内存溢出。ps:溢出的时候我的电脑是拒绝的。cpu 内存 全满了。
绘画少说。接下来上码
public Object excel2007Export(HttpServletResponse response, HttpServletRequest request) {
long time = System.currentTimeMillis();
SyEUser user = SingUtil.getUser(request);
/**
* CacheInsert.MAPMCHECKEXPORT 类型 Map 常量 为了防止单一用户快速点爆服务。
*/
log.info("map=" + CacheInsert.MAPMCHECKEXPORT.get(user.getUserId()));
if (CacheInsert.MAPMCHECKEXPORT.get(user.getUserId()) == null || CacheInsert.MAPMCHECKEXPORT.get(user.getUserId())) {
log.info("数据导出执行");
CacheInsert.MAPMCHECKEXPORT.put(user.getUserId(), false);
try {
//读取项目模板转换成流
ClassPathResource cpr = new ClassPathResource("/templates/excelMartyrs/" + "xxxx.xlsx");
InputStream is = cpr.getInputStream();
XSSFWorkbook workbook = new XSSFWorkbook(is);
// SXSSFWorkbook 专门处理大数据导出的方法。ps:导出上线1000000条数据。
SXSSFWorkbook wb = new SXSSFWorkbook(workbook);
//读取sheet 1
SXSSFSheet sheet0 = (SXSSFSheet) wb.getSheetAt(0);
//在内存中保留1000行,超过的行将刷新到磁盘
sheet0.setRandomAccessWindowSize(1000);
//读取数据更新到poi的SXSSFSheet里面。
/**
* 直接向SXSSSheet 添加数据就好了。这里根据不同的业务进行更换就好了
*/
selectInsertExport(user, sheet0, 10000);
String fileName = "xxxx.xlsx";
//生成数据提供下载
//cook 是用来判断时候加载数据完成。
CookieUtil.addCookie(response, "downloadState", "success", 20);
ExcelUtil.downLoadExcel(fileName, response, wb, user.getUserId());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
CookieUtil.addCookie(response, "downloadState", "error", 20);
CacheInsert.MAPMCHECKEXPORT.put(user.getUserId(), true);
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
CookieUtil.addCookie(response, "downloadState", "error", 20);
CacheInsert.MAPMCHECKEXPORT.put(user.getUserId(), true);
e.printStackTrace();
}
log.info("执行时间" + (System.currentTimeMillis() - time) + "毫秒");
CacheInsert.MAPMCHECKEXPORT.put(user.getUserId(), true);
} else {
log.info("数据拒绝导出");
CookieUtil.addCookie(response, "downloadState", "notDownload", 20);
}
return new ResponseEntity<Resource>(HttpStatus.OK);
}
就这行成功的解决了问题了。再一次维护了项目的和平进行