从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API----SXSSF
SXSSF通过一个滑动窗口来限制访问Row的数量从而达到低内存占用的目录,XSSF可以访问所有行。旧的行数据不再出现在滑动窗口中并变得无法访问,与此同时写到磁盘上。
在自动刷新的模式下,可以指定窗口中访问Row的数量,从而在内存中保持一定数量的Row。当达到这一数量时,在窗口中产生新的Row数据,并将低索引的数据从窗口中移动到磁盘中。
或者,滑动窗口的行数可以设定成自动增长的。它可以根据需要周期的根据一次明确的flushRow(int keepRows)调用来进行修改。
优势是速度快,占内存小,缺陷是只能新建表,不能打开老表往里改或者加东西。
参考 http://www.cnblogs.com/iliuyuet/p/4426153.html
例子代码参考 http://blog.csdn.net/fullstack/article/details/38321467
OutputStream os = null; try { HttpServletResponse response = super.getResponse(); response.setContentType("application/force-download"); // 设置下载类型 String filename ="risk_event.xlsx"; response.setHeader("Content-Disposition","attachment;filename=" + filename); // 设置文件的名称 os = response.getOutputStream(); // 输出流 SXSSFWorkbook wb = new SXSSFWorkbook(1000);//内存中保留 1000 条数据,以免内存溢出,其余写入 硬盘 //获得该工作区的第一个sheet Sheet sheet1 = wb.createSheet("sheet1"); int excelRow = 0; //标题行 Row titleRow = (Row) sheet1.createRow(excelRow++); for (int i = 0; i < columnList.size(); i++) { Cell cell = titleRow.createCell(i); cell.setCellValue(columnList.get(i)); } for (int m = 0; m < cycleCount; m++) { List<List<String>> eventStrList = this.convertPageModelStrList(); if (eventStrList!= null && eventStrList.size() > 0) { for (int i = 0; i < eventStrList.size(); i++) { //明细行 Row contentRow = (Row) sheet1.createRow(excelRow++); List<String> reParam = (List<String>) eventStrList.get(i); for (int j = 0; j < reParam.size(); j++) { Cell cell = contentRow.createCell(j); cell.setCellValue(reParam.get(j)); } } } } wb.write(os); } catch (Exception e) { e.printStackTrace(); } finally { try { if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } // 关闭输出流 }
© 2018, 新之助meow. 原创文章转载请注明: 转载自http://www.xinmeow.com