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表单相关推荐

  1. JAVA笔记-如何将百万级数据高效的导出到Excel表单

    使用JAVA有没有什么办法导出百万级的数据到Excel工作表. ps: 首先科普一下基础知识 Excel 2003及以下的版本.一张表最大支持65536行数据,256列.也就是说excel2003完全 ...

  2. java导出动态excel表单----表头和内容都为动态

    数据表 CREATE TABLE `f_form` (`id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',`org_id` bigint(32) ...

  3. java 动态导出excel表单 无模板文件下载

    java 动态导出excel表单 无模板文件下载 public ResponseEntity<byte[]> exportStanding(@PathVariable Long signu ...

  4. java 动态导出excel表单 无模板本地生成

    java 动态导出excel表单 无模板本地生成 这里使用的是alibaba的公共类excelWriter,注意在pom文件中要引入easyExcel的依赖 public void exportExc ...

  5. Java使用FreeMarker自动生成Word文档(带图片和表单)

    Java使用FreeMarker自动生成Word文档(带图片和表单) 1 背景 2 目标效果 3 创建Word模板 3.1 创建模板文档 3.2 转换模板文档 3.3 处理模板文档中的占位符 3.4 ...

  6. Java入力项目无法设定到form_html中关于form与表单提交操作的资料集合

    原标题:html中关于form与表单提交操作的资料集合 这里我们介绍一下form元素与表单提交方面的知识. form元素 form元素的DOM接口是HTMLFormElement,继承自HTMLEle ...

  7. java客户端重复请求_Java后台防止客户端重复请求、提交表单实现原理

    Java后台防止客户端重复请求.提交表单实现原理 发布于 2021-1-8| 复制链接 摘记: 这篇文章主要介绍了Java后台防止客户端重复请求.提交表单实现原理,文中通过示例代码介绍的非常详细,对大 ...

  8. java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫...

    A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 , ...

  9. 如何将几十万的数据高效的导出到excel中

    参考文章: excel 大量数据导出: POI之SXSSFWorkbook大量数据导出至excel  https://blog.csdn.net/k_520_w/article/details/844 ...

最新文章

  1. 马云第一次创业翻译社,差点倒闭,兼卖鲜花和礼物维持终翻身
  2. Linux/Unix the definition of cpu-nice
  3. 程序员面试系列——选择排序
  4. boost::gil::threshold_binary用法的测试程序
  5. Spring Boot 最流行的 16 条最佳实践!
  6. TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)...
  7. ef 关联依赖属性_基础巩固之:xmlns属性梳理
  8. java8的新特性_Java8的
  9. 2018年个人的一些简单预测
  10. Excel的规划求解【详细步骤】
  11. 数据库MySQL学习——内含34道MySQL练习题及答案
  12. 前端实现动画的7种方式
  13. 计算机word表格怎么求和,如何在Word中插入Excel自动汇总a求和表格,上班族必备技巧...
  14. 【网络设备】Cisco路由器密码重置及配置
  15. Python获取下周一日期
  16. mkfs.ext3 --Discarding device blocks: 4096/196608
  17. html按钮悬停,html – 仅在悬停时显示按钮
  18. 姿态估计1-05:FSA-Net(头部姿态估算)-训练测试数据制作-预处理代码讲解
  19. 【排序算法】归并排序(C语言)
  20. webpack + typescript 开发微信小游戏实践

热门文章

  1. 分享一个免费Api小网站
  2. html5 视频语音对讲,一种基于WebRTC的多人语音视频通话方法及系统与流程
  3. APAHRSSTFPQRPTRAGRQTQLLRS|909409-88-7
  4. 32岁,薪水被应届生倒挂,裸辞了
  5. 了解可编程逻辑器件的历史
  6. c语言字符自动应答器,CTCS-3级应答器报文信息解码仿真研究.pdf
  7. 智能计算机怎么玩游戏,用手机操控电脑 智能手机还能这样玩
  8. 分享一个安卓串口调试助手支持OTG(OTG接USB转TTL)
  9. 20160406】滚出来浪学了高消和异或相关……一脸懵比
  10. 拼多多商品详情api接口 拼多多sku价格信息接口