前言:
适合小白,大神绕道。这个是最近运维项目所用的技术。之前使用的是poi的HSSFWorkbook,发现在导出5万多数据量的时候,jvm就不行了。非常慢,还报内存溢出。
解决办法:在配置tomcat的时候增加下面这句
-Xms128m -Xms1024m -XX:MaxPermSize=512m
方法可行,但是当数据量十几万的时候还是会报内存溢出。然后就想到分sheet页。写完后发现还是不行。
总结就是HSSFWorkbook和XSSFWorkbook都只是小数据量导出还可以。大了的话jvm就承受不了了。HSSFWorkbook这个导出格式xls,XSSFWorkbookd和SXSSFWorkbook格式为.xlsx。废话不说代码走起。
Controller层:
@RequestMapping(value = "/exportPartner", consumes = "multipart/form-data")
public final void exportBank(HttpServletRequest request, HttpServletResponse response, @RequestParam("fileName") String fileName,@RequestParam("headInfos") String headInfos) throws Exception {
//rsts后端查询的数据
//前端可选导出的头字段
JSONArray jsonArray = JSONArray.parseArray((headInfos));
List<Map<String, Object>> headers = (List) jsonArray;
(new ExportUtil<PtMdmPartnerV>()).exportUtil(rsts, headers, fileName, request, response);
}
}
ExportUtil.java
/****
*
* 导出
* @param rsts 数据集合
* @param headInfoList 表头列集合
* @param fileName 文件名称
* */
public void exportUtil(List<T> rsts,List<Map<String, Object>> headInfoList,String fileName,
HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse)throws Exception{
httpServletRequest.setCharacterEncoding("UTF-8");
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("application/x-download");
//fileName 是一个完整导出的文件名称 : 1.xls 2.csv 3.pdf==
//通过截取最后几位得到文件类型
String[] types = StringUtils.split(fileName, ".");
String type= types[types.length-1];
fileName = URLEncoder.encode(fileName, "UTF-8");
//处理文件名中有空格 encode之后变成+号
fileName = fileName.replace("+", "%20");
httpServletResponse.addHeader("Content-Disposition", "attachment;filename="+ fileName);
fileName= URLDecoder.decode(fileName);
if("xls".equals(type)){
exportExcelUtil(rsts,headInfoList,f