POI大数据导出使用SXSSFWorkbook

从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

0.00 avg. rating (0% score) - 0 votes
点赞