zoukankan      html  css  js  c++  java
  • java 使用POI导出百万级数据

    先看结果吧,这只是测试其中有很多因数影响了性能。

    表总数为:7千多万,测试导出100万

     表字段有17个字段

    最终excel大小有60多兆

    总耗时:126165毫秒 差不多2分多钟

    其核心简单来说就是分批写入,就是分页一样。这样的好处就是不会内存溢出。

    (真的不会写博客。。。)

    直接上代码了

    public void download(HttpServletResponse response) throws Exception{
            // 一次读取的数量
            int listCount  = 200000;
            // 求数据库中导出数据的总行数
            Integer totalCount = analysisMapper.totalNum();
            // 根据行数求数据获取次数
            int pageSize = totalCount % listCount > 0 ? (totalCount / listCount) + 1 : totalCount / listCount;
            //创建poi导出数据对象
            SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();
            //创建sheet页
            SXSSFSheet sheet = sxssfWorkbook.createSheet();
            //设置表头信息
            SXSSFRow headRow = sheet.createRow(0);
            List<String> indexList = new ArrayList<>();
            for (int pg = 0; pg < pageSize; pg++) {
                List<Map<String, Object>> list = analysisMapper.downloadData(pg * listCount, listCount);
                if(pg == 0 && list.size() > 0){
                    Map<String, Object> map = list.get(0);
                    for(Map.Entry<String,Object> entry : map.entrySet()){
                        indexList.add(entry.getKey());
                    }
                    for (int j = 0; j < indexList.size(); j++) {
                        headRow.createCell(j).setCellValue(indexList.get(j));
                    }
                }
                // 遍历上面数据库查到的数据
                for (int i = 0; i < list.size(); i++) {
                    SXSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
                    for (int j = 0; j < indexList.size(); j++) {
                        dataRow.createCell(j).setCellValue(list.get(i).get(indexList.get(j)).toString());
                    }
                }
            }
            createFile(response, sxssfWorkbook);
        }
    private void createFile(HttpServletResponse response,SXSSFWorkbook sxssfWorkbook) throws Exception{
            // 下载导出
            String filename = UUID.randomUUID().toString();
            // 设置头信息
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/vnd.ms-excel");
            //设置成xlsx格式
            response.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(filename + ".xlsx","UTF-8"));
            //创建输出流
            ServletOutputStream outputStream = response.getOutputStream();
            //写入数据
            sxssfWorkbook.write(outputStream);
            //关闭流
            outputStream.close();
            sxssfWorkbook.close();
        }

    若果有啥问题请指正。

  • 相关阅读:
    Flask-SQLAlchemy 学习总结
    ubuntu安装redis
    PostgreSQL在Ubuntu上安装指南
    Linux(Ubuntu)下MySQL的安装与配置
    python wechat_sdk间接性的出现错误OfficialAPIError: 40001,说access_token已过期或者不是最新的。
    django不要设置datetime字段auto_now=True
    python 装饰器和 functools 模块
    关于 Python Iterator 协议的一点思考
    python中的enumerate函数
    8 种常被忽视的 SQL 错误用法
  • 原文地址:https://www.cnblogs.com/chancy/p/11599606.html
Copyright © 2011-2022 走看看