有效提升大数据量写入excel的效率
2024-08-25 03:13:23
在开发过程中经常会有需要将数据导出到 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
最新文章
- 玩转Windows服务系列——Debug、Release版本的注册和卸载,及其原理
- Java 8函数编程轻松入门(二)Stream的使用
- JavaScript 基础回顾——函数
- C++ STL vector容器学习
- 浅谈Dictionary用法
- 【leetcode】Spiral Matrix(middle)
- Visual Studio中删除所有空行
- apache AddDefaultCharset
- vs调试 LINK : fatal error LNK1104 ...exe
- PL/pgSQL学习笔记之八
- Android开发之隐式Intent中Intent-filter的三个属性-action,category,data
- Android省电开发 浅析
- Java 按值传递
- (大数据工程师学习路径)第四步 SQL基础课程----SQL介绍及mysql的安装
- Python类的定义
- libevent 实现的socket 通信 server以及解决找不到动态库的方法
- 【记录tomcat报错解决办法】tomcat请求组件没有找到的问题
- SharePoint Framework 在web部件中使用已存在的JavaScript库 - 捆绑打包和外部引用
- ActiveMQ-为什么需要消息中间件?
- Java课程寒假之开发记账本软件(网页版)之二
热门文章
- iOS:菜单控制器和菜单项:UIMenuController和UIMenuItem
- delphi VCL研究之消息分发机制-delphi高手突破读书笔记
- [OpenCV]实验1.1:图像加载、显示
- ispy 编译笔记
- liunx系统安装jdk的方法
- Linux命令计算文件中某一列的平均值
- J2EE环境搭建(三)配置Tomcat 7.0的局部数据源
- nodejs之SVG转图片下载方案
- phpMyAdmim和Yii 连接Mysql报错。
- 类非静态成员的函数指针 的使用 Function pointer of a non-static member function of a class