在开发过程中经常会有需要将数据导出到 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

最新文章

  1. 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理
  2. Java 8函数编程轻松入门(二)Stream的使用
  3. JavaScript 基础回顾——函数
  4. C++ STL vector容器学习
  5. 浅谈Dictionary用法
  6. 【leetcode】Spiral Matrix(middle)
  7. Visual Studio中删除所有空行
  8. apache AddDefaultCharset
  9. vs调试 LINK : fatal error LNK1104 ...exe
  10. PL/pgSQL学习笔记之八
  11. Android开发之隐式Intent中Intent-filter的三个属性-action,category,data
  12. Android省电开发 浅析
  13. Java 按值传递
  14. (大数据工程师学习路径)第四步 SQL基础课程----SQL介绍及mysql的安装
  15. Python类的定义
  16. libevent 实现的socket 通信 server以及解决找不到动态库的方法
  17. 【记录tomcat报错解决办法】tomcat请求组件没有找到的问题
  18. SharePoint Framework 在web部件中使用已存在的JavaScript库 - 捆绑打包和外部引用
  19. ActiveMQ-为什么需要消息中间件?
  20. Java课程寒假之开发记账本软件(网页版)之二

热门文章

  1. iOS:菜单控制器和菜单项:UIMenuController和UIMenuItem
  2. delphi VCL研究之消息分发机制-delphi高手突破读书笔记
  3. [OpenCV]实验1.1:图像加载、显示
  4. ispy 编译笔记
  5. liunx系统安装jdk的方法
  6. Linux命令计算文件中某一列的平均值
  7. J2EE环境搭建(三)配置Tomcat 7.0的局部数据源
  8. nodejs之SVG转图片下载方案
  9. phpMyAdmim和Yii 连接Mysql报错。
  10. 类非静态成员的函数指针 的使用 Function pointer of a non-static member function of a class