欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

大数据量导出心得 SXSSFWorkbook

程序员文章站 2022-07-13 15:30:24
...

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

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

上一篇: 三色阶梯

下一篇: 自定义View画圆