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

若果有啥问题请指正。

原文地址:https://www.cnblogs.com/chancy/p/11599606.html

时间: 2024-08-12 16:14:22

java 使用POI导出百万级数据的相关文章

php - 从数据库导出百万级数据(CSV文件)

将数据库连接信息.查询条件.标题信息替换为真实数据即可使用. <?php set_time_limit(0); ini_set('memory_limit', '128M'); $fileName = date('YmdHis', time()); header('Content-Encoding: UTF-8'); header("Content-type:application/vnd.ms-excel;charset=UTF-8"); header('Content-Dis

php 连接oracle 导出百万级数据

1,我们一般做导出的思路就是,根据我们想要的数据,全部查询出来,然后导出来,这个对数据量很大的时候会很慢,这里我提出来的思想就是分页和缓冲实现动态输出. 2.普通的我就不说了,下面我说一下分页和内存刷新思想.代码如下: $conn = oci_connect('fin_data', 'fin_data', "(DEscriptION=(ADDRESS=(PROTOCOL =TCP)(HOST=192.168.6.65)(PORT = 1521))(CONNECT_DATA =(SID=hqygd

Java通过POI技术操作Excel(3)----数据导出

在之前的博客中,总结了Excel模板生成和Excel数据录入,然后剩最后一个模块,数据库中数据读取,在之前的基础上我们来看这一模块,应该已经非常容易了,接下来简单的介绍一下: 这里我们仍然以jsp+servlet为例,对SqlServer2005数据库进行操作,如下都是基本步骤: 1.连接数据库:2.根据sql语句获取数据库中值:3.将值进行导出操作: 首先,我们来记性数据库的连接,这个相信接触过java的人都不会陌生,我就不赘述了 1 public class DataBase { 2 pri

JAVA关于POI导出Excel内存溢出的解决方案

JAVA关于POI导出Excel内存溢出的解决方案 在我们使用JAVA开发过程中,经常要导出查询获得的数据,这些数据一般情况下都是以Excel存储的,因此我们在导出数据的时候要使用JAVA的POI库,其主要是对各种windows平台的数据格式进行操作,在这里,我们是对Excel操作. 生成Excel的过程原理是这样的,首先,我们对数据库进行查询,获取相应的结果集,一般是list集合,然后生成Workbook对象,根据生成的Workbook对象获取sheet对象,根据此sheet对象获取Row对象

java excel poi导出问题

1.每次打开excel就会提示:"此文件中某些文本格式可能已经更改,因为它已经超出最多允许的字体数.关闭其他文档再试一次可能有用." 解决办法:是因为创建的字体太多了,当调用HSSFWorkbook的createFont之后就创建一种字体,就算字体属性完全一样也是要创建一个新字体对象的: 而创建的数目是有限的,因此不要频繁调用HSSFWorkbook的createFont方法, 把创建的font缓存起来,相同字体属性的就不要再create了 粘贴的内容中由于格式或数据问题,可能引发了E

java的poi技术读取Excel数据

这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: java的poi技术读取Excel数据到MySQL 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术 :java的jxl技术导入Excel  下面是本文的项目结构: 项目中所需要的jar文件: 所用的Excel数据(2003-2007,2010都是一

java的poi技术读取Excel数据到MySQL

这篇blog是介绍java中的poi技术读取Excel数据,然后保存到MySQL数据中. 你也可以在 : java的poi技术读取和导入Excel了解到写入Excel的方法信息 使用JXL技术可以在 :java的jxl技术导入Excel  项目结构: Excel中的测试数据: 数据库结构: 对应的SQL: 1 CREATE TABLE `student_info` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `no` varchar(20) DEFAU

java中使用poi导出excel表格数据并且可以手动修改导出路径

在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下 jar包下载路径:http://download.csdn.net/download/pumpkin09/7077011 第二步:添加poi导出工具类 1 package com.yjd.admin.util; 2 3 import java.io.IOException; 4 import ja

解决Java POI导出海量Excel数据内存溢出

使用POI导出Excel数据的时候有两个方法可以创建WorkBook: HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx 当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space内存溢出错误. 从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API,也就是SXS