Java之Poi大数据量导出技术SXSSFWorkbook应用

前言:

适合小白,大神绕道。这个是最近运维项目所用的技术。之前使用的是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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值