大数据量导出心得 SXSSFWorkbook

一开始做导出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(HttpStatus.OK);
    }

就这行成功的解决了问题了。再一次维护了项目的和平进行

你可能感兴趣的:(后台,poi)