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();
}
若果有啥问题请指正。
java 使用POI导出百万级数据的更多相关文章
- 使用POI导出百万级数据到excel的解决方案
1.HSSFWorkbook 和SXSSFWorkbook区别 HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls,一张表最大支持65536行数据,256列 ...
- java 分页导出百万级数据到excel
最近修改了一个导出员工培训课程的历史记录(一年数据),导出功能本来就有的,不过前台做了时间限制(只能选择一个月时间内的),还有一些必选条件, 导出的数据非常有局限性.心想:为什么要做出这么多条件限制呢 ...
- php - 从数据库导出百万级数据(CSV文件)
将数据库连接信息.查询条件.标题信息替换为真实数据即可使用. <?php set_time_limit(0); ini_set('memory_limit', '128M'); $fileNam ...
- php 连接oracle 导出百万级数据
1,我们一般做导出的思路就是,根据我们想要的数据,全部查询出来,然后导出来,这个对数据量很大的时候会很慢,这里我提出来的思想就是分页和缓冲实现动态输出. 2.普通的我就不说了,下面我说一下分页和内存刷 ...
- 问问题_Java一次导出百万条数据生成excel(web操作)
需求:在web页面操作,一次导出百万条数据并生成excel 分析: 1.异步生成Excel,非实时,完成后使用某种方式通知用户 2.生成多个excel文件,并打包成zip文件,因为一个excel容纳不 ...
- java的poi技术读取Excel数据
这篇blog主要是讲述java中poi读取excel,而excel的版本包括:2003-2007和2010两个版本, 即excel的后缀名为:xls和xlsx. 读取excel和MySQL相关: ja ...
- MYSQL百万级数据,如何优化
MYSQL百万级数据,如何优化 首先,数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度.但是,有些情况索引是 ...
- JAVA使用POI如何导出百万级别数据(转)
https://blog.csdn.net/happyljw/article/details/52809244 用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会 ...
- JAVA使用POI如何导出百万级别数据
用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...
随机推荐
- Python查询Mysql时返回字典结构的代码
Python查询Mysql时返回字典结构的代码 MySQLdb默认查询结果都是返回tuple,输出时候不是很方便,必须按照0,1这样读取,无意中在网上找到简单的修改方法,就是传递一个cursors.D ...
- 不能在jsp页面<c:choose>对标签中使用<!---->进行注释
jsp页面<c:choose>标签中使用<!---->进行注释,访问出现异常,如下: 标签范围:
- forge k8s/kubernetes ci/cd 最佳实践
forge的官网是: http://forge.sh forge工具是一个部署工具, 将你的应用自动更新到kubernets集群中, 只需要配置简洁的配置文件和模板即可. 其它的就交给forge, 它 ...
- Data - 数据挖掘的基础概念
主要内容来自于<微信公众号:程SIR说> 1 数据挖掘 数据挖掘(Data Mining,简称DM),是指从大量的数据中,挖掘出未知的且有价值的信息和知识的过程. 数据挖掘是一门交叉学科, ...
- Nginx-windows
1.下载 http://nginx.org/ 选择最新稳定版本,例如nginx-1.15.5 mainline version has been released. 点击后,跳转页面,选择Stable ...
- selenium3 web自动化测试框架 二:页面基础操作、元素定位方法封装、页面操作方法封装
学习目的: 掌握自动化框架中需要的一些基础web操作 正式步骤: 使用title_contains检查页面是否正确 # -*- coding:utf-8 -*- import time from se ...
- DS博客作业--07查找
目录 DS博客作业--07查找 1.本周学习总结(0--2分) 1.思维导图 2.谈谈你对查找运算的认识及学习体会. 2.PTA实验作业(6分) 2.1.题目1:6-1 二叉搜索树的操作集 (30 分 ...
- Java基础篇---多线程
内容导航: 1.多线程的实现方式 2.线程安全问题 3.线程间通信 4.生产者消费者模式 第一部分多线程的实现方式 在java中多线程实现方式有2种 一.自定义一个类A,继承Thread类 publi ...
- Jmeter对Websocket进行接口压力测试
压力测试是给软件不断加压,强制其在极限的情况下运行,观察它可以运行到何种程度,从而发现性能缺陷,是通过搭建与实际环境相似的测试环境,通过测试程序在同一时间内或某一段时间内,向系统发送预期数量的交易请求 ...
- java中讲讲DataInputStream的用法,举例?
[学习笔记] 2.4 DataInputStream的用法 马 克-to-win:DataInputStream顾名思义:就是专门用来读各种各样的数据的,比如(int,char,long等),一定要注 ...