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

表总数为: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();
}

若果有啥问题请指正。

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

  1. 使用POI导出百万级数据到excel的解决方案

    1.HSSFWorkbook 和SXSSFWorkbook区别 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,一张表最大支持65536行数据,256列 ...

  2. java 分页导出百万级数据到excel

    最近修改了一个导出员工培训课程的历史记录(一年数据),导出功能本来就有的,不过前台做了时间限制(只能选择一个月时间内的),还有一些必选条件, 导出的数据非常有局限性.心想:为什么要做出这么多条件限制呢 ...

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

    将数据库连接信息.查询条件.标题信息替换为真实数据即可使用. <?php set_time_limit(0); ini_set('memory_limit', '128M'); $fileNam ...

  4. php 连接oracle 导出百万级数据

    1,我们一般做导出的思路就是,根据我们想要的数据,全部查询出来,然后导出来,这个对数据量很大的时候会很慢,这里我提出来的思想就是分页和缓冲实现动态输出. 2.普通的我就不说了,下面我说一下分页和内存刷 ...

  5. 问问题_Java一次导出百万条数据生成excel(web操作)

    需求:在web页面操作,一次导出百万条数据并生成excel 分析: 1.异步生成Excel,非实时,完成后使用某种方式通知用户 2.生成多个excel文件,并打包成zip文件,因为一个excel容纳不 ...

  6. java的poi技术读取Excel数据

    这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: ja ...

  7. MYSQL百万级数据,如何优化

    MYSQL百万级数据,如何优化     首先,数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度.但是,有些情况索引是 ...

  8. JAVA使用POI如何导出百万级别数据(转)

    https://blog.csdn.net/happyljw/article/details/52809244   用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会 ...

  9. JAVA使用POI如何导出百万级别数据

    用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...

随机推荐

  1. idea使用Snyk对项目进行安全漏洞审核、修复

    笔者今天早上打开idea,看到右侧插件栏有一个大狗头,不懂什么时候好奇心驱使安装了这个插件.按图索骥,打开插件. 打开狗,里面会出现好多英文,其中有一处蓝色标底,here 字样的,你点击进去, 用Go ...

  2. MySQL简单管理

    基础入门 ============管理MySQL========== .查看MySQL版本 mysqladmin --version .启动MySQL /etc/init.d/mysqld start ...

  3. 针对thinkphp 5框架存储过程bug而重写的存储过程的扩展类

    近期用tp5框架调取存储过程发现有bug,借鉴了一些官方的函数.以及找了个mysqli的类把存储过程重新写了个扩展类,下面两个类直接放置项目extend目录的stored(这个文件夹名称请按个人习惯命 ...

  4. 【Python】机器学习之单变量线性回归 利用批量梯度下降找到合适的参数值

    [Python]机器学习之单变量线性回归 利用批量梯度下降找到合适的参数值 本题目来自吴恩达机器学习视频. 题目: 你是一个餐厅的老板,你想在其他城市开分店,所以你得到了一些数据(数据在本文最下方), ...

  5. Centos7下 升级php5.4到7.1 yum安装

    1.查看当前 PHP 版本 php -v 查看当前 PHP 相关的安装包,删除之 yum list installed | grep php yum remove php yum remove php ...

  6. 不同Json工具对空串和NULL的序列号处理:net.sf.json 和 fastjson

    目录 1.测试代码 2.测试结果: 3.总结: 4.注:Maven中引入net.sf.json的方式 net.sf.json 和 fastjson 对于空串和NULL的处理: 1.测试代码 packa ...

  7. 冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱

    题1 国际象棋(chess) [问题描述] 有N个人要参加国际象棋比赛,该比赛要进行K场对弈.每个人最多参加2场对弈,最少参加0场对弈.每个人都有一个与其他人都不相同的等级(用一个正整数来表示).在对 ...

  8. js延迟2秒执行事件

    有时候,我们在做修改回显数据时,就需要默认触发一些事件,但是由于数据没有很快从服务器中取回,所以就有延迟执行js事件 setTimeout(function () { // 这里就是处理的事件 }, ...

  9. kindeditor的配置jsp版

    1.将kindeditor资源下载下来,点击这里下载: 2.将资源解压,因为是jsp版本所以只需要保留jsp的文件即可,最终目录为下图 3.在所给的jsp的demo中做配置 注意:demo.jsp中引 ...

  10. spring-redis使用

    导包 注入调用           opsForValue()     opsForList() redisTemplate   配置 ,为了   对key采用string序列化方式          ...