• 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();
        }

    若果有啥问题请指正。

  • 相关阅读:
    没有什么,开发ASP.NET时随便写写,想到什么写什么
    MS SQL Server带有时间的记录怎样查询
    给RadioButtonList绑定Selected的值
    在GridView控件内文本框实现TextChanged事件
    MS SQL Server递归查询
    ASP.NET MVC使用jQuery无刷新上传
    MySQL 慢查询操作梳理
    ubuntu系统下防火墙简单使用
    crontab日常使用梳理
    ubuntu下nginx+php5的部署
  • 原文地址:https://www.cnblogs.com/chancy/p/11599606.html
Copyright © 2020-2023  润新知