在开发过程中经常会有需要将数据导出到 excel 的需求,当数据量很大,达到几万甚至几十万、几百万级别的时候,如何加快生成 excel 的速度呢?
首先普及一下知识背景:
Excel2003 及以下版本一张表最多支持 65536 行、256 列数据,所以要生成十万、百万级别数据就不能用 Excel2003 了;
Excel2007 版本一张表最多支持1048576行,16384 列,基本可以满足百万级别以下的数据量级。

一般通过 poi 生成 excel 的方式如下:(原谅我以前没有研究过poi,就只会用这种方式,而且网上的demo好多也是这种方式)

 public static void exportDataToExcel1(String[] header, List<String[]> datas, String path) {
File file = new File(path);
Workbook workbook = null;
if (path.endsWith(EXCEL_2003)) {
workbook = new HSSFWorkbook();
}
if (path.endsWith(EXCEL_2007)) {
workbook = new XSSFWorkbook();
}
Sheet sheet = workbook.createSheet();
Row firstRow = sheet.createRow(0); //第一行
for (int i = 0; i < header.length; i++) {
Cell cell = firstRow.createCell(i);
cell.setCellValue(header[i]);
}
if (datas != null && datas.size() > 0) {
for (int i = 0; i < datas.size(); i++) {
Row row = sheet.createRow(i + 1);
String[] d = datas.get(i);
for (int j = 0; j < d.length; j++) {
Cell cell = row.createCell(j);
cell.setCellValue(d[j]);
}
}
}
try {
OutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

利用上述方式生成一张 10万 行、30 列的 excel 表在我的电脑上耗时大约40多秒

数据准备了 1731 ms
导出花费了 46795 ms

查看 poi 官网http://poi.apache.org/spreadsheet/index.html发现从 3.8 beta3 版本开始新增 SXSSF api 用于解决大数据量场景

这种方式新增了自动刷入数据的机制,可以设置一个数据量阈值,达到这个阈值后会将数据刷入到磁盘,缓解了运行时的压力。

改后的代码如下:

public static void exportDataToExcel(String[] header, List<String[]> datas, String path) {
File file = new File(path);
SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(100);
Sheet sheet = sxssfWorkbook.createSheet();
Row firstRow = sheet.createRow(0); //第一行
for (int i = 0; i < header.length; i++) {
Cell cell = firstRow.createCell(i);
cell.setCellValue(header[i]);
}
if (datas != null && datas.size() > 0) {
for (int i = 0; i < datas.size(); i++) {
Row row = sheet.createRow(i + 1);
String[] d = datas.get(i);
for (int j = 0; j < d.length; j++) {
Cell cell = row.createCell(j);
cell.setCellValue(d[j]);
}
}
}
try {
OutputStream outputStream = new FileOutputStream(file);
sxssfWorkbook.write(outputStream);
outputStream.flush();
outputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
sxssfWorkbook.dispose();
}
}

使用这种方式测试相同量级的数据,导出excel缩短到了6、7秒,可见这个提升幅度还是很明显的。

数据准备了 1096 ms
导出花费了 6784 ms

有效提升大数据量写入excel的效率的更多相关文章

  1. Winform .NET 利用NPOI导出大数据量的Excel

    前言:公司让做一个导出数据到Excel的小工具,要求是用户前端输入sql语句,点击导出按钮之后,将数据导出到Excel,界面如图所示:文件下端显示导出的进度 遇到的问题: 1.使用NPOI进行Exce ...

  2. 浅谈PageHelper插件分页实现原理及大数据量下SQL查询效率问题解决

    前因:项目一直使用的是PageHelper实现分页功能,项目前期数据量较少一直没有什么问题.随着业务扩增,数据库扩增PageHelper出现了明显的性能问题.几十万甚至上百万的单表数据查询性能缓慢,需 ...

  3. POI读写大数据量EXCEL

    另一篇文章http://www.cnblogs.com/tootwo2/p/8120053.html里面有xml的一些解释. 大数据量的excel一般都是.xlsx格式的,网上使用POI读写的例子比较 ...

  4. java 导出Excel 大数据量,自己经验总结!

    出处: http://lyjilu.iteye.com/ 分析导出实现代码,XLSX支持: /** * 生成<span style="white-space: normal; back ...

  5. POI读写大数据量excel,解决超过几万行而导致内存溢出的问题

    1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...

  6. [转]POI大数据量Excel解决方案

    全文转载自:jinshuaiwang的博客 目前处理Excel的开源javaAPI主要有两种,一是Jxl(Java Excel API),Jxl只支持Excel2003以下的版本.另外一种是Apach ...

  7. POI3.8解决导出大数据量excel文件时内存溢出的问题

    POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表格且堆空间有限时使用.SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入 ...

  8. c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习

    c#中@标志的作用   参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...

  9. java excel大数据量导入导出与优化

    package com.hundsun.ta.utils; import java.io.File; import java.io.FileOutputStream; import java.io.I ...

随机推荐

  1. angular 的进一步深入理解

    早上同事问我个问题,angular 的表单验证有没有啥第三方库可以用? 这个问题,我想了下,之前我做的表单验证好像也没用到第三方的库来验证,直接用angular 内置的 directive 就可以搞定 ...

  2. 阿里巴巴Android开发手册(规约)

    阿里巴巴Android开发手册(规约) 学习了:https://www.cnblogs.com/jb2011/p/8487889.html  这个猛 https://blog.csdn.net/ali ...

  3. meta文件是什么东西

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.meta 标签用于网页的<head>与</head>中,meta 标签的用处很多.meta 的属性有两种:name和 ...

  4. SQL如何将EXCEL导入到SQL数据库

    1 新建一个EXCEL工作表,注意默认有三个工作簿,我们只在Sheet1中创建几个字段并存储若干值保存为TEST.xls 2运行Excel to MySQL软件,注意Sourece和Destinati ...

  5. Python自省 type(),dir(),getattr(),hasattr(),isinstance().

    Python自省 这个也是python彪悍的特性. 自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr() ...

  6. Ubuntu安装Mac皮肤

    如果是ubuntu的PC版,在稳定性方面的要求不是非常高,而又想换换界面养养眼,像我一般只用我的Ubuntu12.04来写写代码,娱乐娱乐的,可以试试Ubuntu的Mac皮肤. 好了,废话不多说,上图 ...

  7. Android 歌词显示

    一.概述 项目中设计到歌词显示的问题,这一块之前没有涉及过,只是套用过一个开源的项目,效果还行,于是想到拿来稍作修改,以适应项目需求. 二.歌词控件 先来看下这个自定义控件写的歌词控件吧: publi ...

  8. 使用PHP和GZip压缩网站JS/CSS文件加速网站访问速度

    使用PHP和GZip压缩网站JS/CSS文件加速网站访问速度 一些泛WEB 2.0网站为了追求用户体验,可能会大量使用CSS和JS文件.这就导致在服务器带宽一定的情况下,多用户并发访问速度变慢.如何加 ...

  9. Tomcat源代码解析系列

    学web也有一段时间了.为了从底层了解web应用在Tomcat中的执行,决定看一下Tomcat的源代码參见<How Tomcat works>    和大牛博客.对大体架构有了一定的了解, ...

  10. .NET Remoting 入门实例

    1.创建服务端Class:ProxyServerRemoting using System; using System.Collections.Generic; using System.Text; ...