java实现如何将百万级数据高效的导出到Excel表单
ps: 首先科普一下基础知识
Excel 2003及以下的版本。一张表最大支持65536行数据,256列。也就是说excel2003完全不可能满足百万数据导出的需求。
Excel 2007-2010版本。一张表最大支持1048576行,16384列;
笔者使用的是office 2010,更高的版本笔者没有使用过,暂时无法判断。
由此看来百万级的数据量对Excel自身已经是属于接近极限的程度。
假如我们有更大的需求怎么办呢?
既然单表支持最大是104w条数据,那么更大的需求量我们就只能通过程序级分表操作的方式来实现了。O(∩_∩)O哈哈~
对于操作Excel的类库。笔者其实了解的并不是很多。只是很早以前使用过POI这个类库,感觉很不错。于是决定从它入手。看看POI有没有什么比较有效的好点的解决办法。由于笔者以前使用的POI版本比较低。而且使用于excel 2003版本。所以遇到了不少问题。
poi-ooxml和poi-ooxml-schemas是poi对2007及以上版本的扩充。于是在maven依赖中增加:
<dependency>2 <groupId>org.apache.poi</groupId>3 <artifactId>poi-ooxml</artifactId>4 <version>3.10-FINAL</version>5 </dependency>6 <dependency>7 <groupId>org.apache.poi</groupId>8 <artifactId>poi-ooxml-schemas</artifactId>9 <version>3.10-FINAL</version> 10 </dependency>
赶紧修改自己的代码。实现了支持Excel 2010版本。瞬间有种大功告成的感觉,有木有。。O(∩_∩)O哈哈~。好有成就感的说。
public static void Excel2007AboveOperateOld(String filePath) throws IOException {XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(filePath)));// 获取第一个表单Sheet first = workbook.getSheetAt(0);for (int i = 0; i < 100000; i++) {Row row = first.createRow(i);for (int j = 0; j < 11; j++) {if(i == 0) {// 首行row.createCell(j).setCellValue("column" + j);} else {// 数据if (j == 0) {CellUtil.createCell(row, j, String.valueOf(i));} elseCellUtil.createCell(row, j, String.valueOf(Math.random()));}}}// 写入文件FileOutputStream out = new FileOutputStream("workbook.xlsx");workbook.write(out);out.close();}
赶紧运行跑起来。第一次测试写入1w条数据。耗时8秒多点。感觉写入速度好慢,1w条8秒,100w。。我的天。这效率完全不能接受。于是测试10w,看看测试一下是不是真的写入速度过慢。测试结果让人崩溃。
测试导出10w条数据到excel耗时将近50秒。于是这种方式被暂时放弃。成就感瞬间被打落在地。
再次回到POI的官网。http://poi.apache.org/spreadsheet/index.html
官方提到自POI3.8版本开始提供了一种SXSSF的方式,用于超大数据量的操作。于是...
原文:
SXSSF is an API-compatible streaming extension of XSSF to be used when very large spreadsheets have to be produced...
马上开动修改代码。代码如下:
public static void Excel2007AboveOperate(String filePath) throws IOException {XSSFWorkbook workbook1 = new XSSFWorkbook(new FileInputStream(new File(filePath)));SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(workbook1, 100); // Workbook workbook = WorkbookFactory.create(new FileInputStream(new File(filePath)));Sheet first = sxssfWorkbook.getSheetAt(0);for (int i = 0; i < 100000; i++) {Row row = first.createRow(i);for (int j = 0; j < 11; j++) {if(i == 0) {// 首行row.createCell(j).setCellValue("column" + j);} else {// 数据if (j == 0) {CellUtil.createCell(row, j, String.valueOf(i));} elseCellUtil.createCell(row, j, String.valueOf(Math.random()));}}}FileOutputStream out = new FileOutputStream("workbook.xlsx");sxssfWorkbook.write(out);out.close();}
多次运行测试。查看数据
1 Cast time : 11604
看到数据的瞬间感觉,哇塞。好给力的说。居然从将近50秒缩短带11秒。。。
为什么都是代码差距就这么大呢?
原来,SXSSF实现了一套自动刷入数据的机制。当数据数量达到一定程度时(用户可以自己设置这个限制)。像文本中刷入部分数据。这样就缓解了程序运行时候的压力。达到高效的目的。O(∩_∩)O哈哈~
再一次测试单表写入100w条数据。
1 Cast time : 87782
将近90秒就完成了100w条数据的写入。O(∩_∩)O哈哈~。 虽然看上去依旧有一点慢。但是考虑到数据量这样的耗时,想来已经是可以接受的了。100w条数据生成的Excel表单居然有136mb。打开就这个文档都花了不少时间。哈哈
java实现如何将百万级数据高效的导出到Excel表单相关推荐
- JAVA笔记-如何将百万级数据高效的导出到Excel表单
使用JAVA有没有什么办法导出百万级的数据到Excel工作表. ps: 首先科普一下基础知识 Excel 2003及以下的版本.一张表最大支持65536行数据,256列.也就是说excel2003完全 ...
- java导出动态excel表单----表头和内容都为动态
数据表 CREATE TABLE `f_form` (`id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',`org_id` bigint(32) ...
- java 动态导出excel表单 无模板文件下载
java 动态导出excel表单 无模板文件下载 public ResponseEntity<byte[]> exportStanding(@PathVariable Long signu ...
- java 动态导出excel表单 无模板本地生成
java 动态导出excel表单 无模板本地生成 这里使用的是alibaba的公共类excelWriter,注意在pom文件中要引入easyExcel的依赖 public void exportExc ...
- Java使用FreeMarker自动生成Word文档(带图片和表单)
Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...
- Java入力项目无法设定到form_html中关于form与表单提交操作的资料集合
原标题:html中关于form与表单提交操作的资料集合 这里我们介绍一下form元素与表单提交方面的知识. form元素 form元素的DOM接口是HTMLFormElement,继承自HTMLEle ...
- java客户端重复请求_Java后台防止客户端重复请求、提交表单实现原理
Java后台防止客户端重复请求.提交表单实现原理 发布于 2021-1-8| 复制链接 摘记: 这篇文章主要介绍了Java后台防止客户端重复请求.提交表单实现原理,文中通过示例代码介绍的非常详细,对大 ...
- java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫...
A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 , ...
- 如何将几十万的数据高效的导出到excel中
参考文章: excel 大量数据导出: POI之SXSSFWorkbook大量数据导出至excel https://blog.csdn.net/k_520_w/article/details/844 ...
最新文章
- 马云第一次创业翻译社,差点倒闭,兼卖鲜花和礼物维持终翻身
- Linux/Unix the definition of cpu-nice
- 程序员面试系列——选择排序
- boost::gil::threshold_binary用法的测试程序
- Spring Boot 最流行的 16 条最佳实践!
- TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)...
- ef 关联依赖属性_基础巩固之:xmlns属性梳理
- java8的新特性_Java8的
- 2018年个人的一些简单预测
- Excel的规划求解【详细步骤】
- 数据库MySQL学习——内含34道MySQL练习题及答案
- 前端实现动画的7种方式
- 计算机word表格怎么求和,如何在Word中插入Excel自动汇总a求和表格,上班族必备技巧...
- 【网络设备】Cisco路由器密码重置及配置
- Python获取下周一日期
- mkfs.ext3 --Discarding device blocks: 4096/196608
- html按钮悬停,html – 仅在悬停时显示按钮
- 姿态估计1-05:FSA-Net(头部姿态估算)-训练测试数据制作-预处理代码讲解
- 【排序算法】归并排序(C语言)
- webpack + typescript 开发微信小游戏实践
热门文章
- 分享一个免费Api小网站
- html5 视频语音对讲,一种基于WebRTC的多人语音视频通话方法及系统与流程
- APAHRSSTFPQRPTRAGRQTQLLRS|909409-88-7
- 32岁,薪水被应届生倒挂,裸辞了
- 了解可编程逻辑器件的历史
- c语言字符自动应答器,CTCS-3级应答器报文信息解码仿真研究.pdf
- 智能计算机怎么玩游戏,用手机操控电脑 智能手机还能这样玩
- 分享一个安卓串口调试助手支持OTG(OTG接USB转TTL)
- 20160406】滚出来浪学了高消和异或相关……一脸懵比
- 拼多多商品详情api接口 拼多多sku价格信息接口