用JavaPOI导出Excel时,我们会考虑到Excel版本及数据量的问题。针对不同的Excel版本,要采用不同的工具类。HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx。

用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在64位中没有限制,但是在64位的系统中,性能并不是太好),好在POI3.8版本新出来了一个SXSSFWorkbook对象,它就是用来解决大数据量以及超大数据量的导入导出操作的,但是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式的Excel文件。

这里普及一下,在POI中使用HSSF对象时,excel 2003最多只允许存储65536条数据,一般用来处理较少的数据量,这时对于百万级别数据,Excel肯定容纳不了,而且在计算机性能稍低的机器上测试,就很容易导致堆溢出。而当我升级到XSSF对象时,它可以直接支持excel2007以上版本,因为它采用ooxml格式。这时excel可以支持1048576条数据,单个sheet表就支持近104万条数据了,虽然这时导出100万数据能满足要求,但使用XSSF测试后发现偶尔还是会发生堆溢出,所以也不适合百万数据的导出。

现在我们知道excel2007及以上版本可以轻松实现存储百万级别的数据,但是系统中的大量数据是如何能够快速准确的导入到excel中这好像是个难题,对于一般的web系统,我们为了解决成本,基本都是使用的入门级web服务器tomcat,既然我们不推荐调整JVM的大小,那我们就要针对我们的代码来解决我们要解决的问题。在POI3.8之后新增加了一个类,SXSSFWorkbook,采用当数据加工时不是类似前面版本的对象,它可以控制excel数据占用的内存,他通过控制在内存中的行数来实现资源管理,即当创建对象超过了设定的行数,它会自动刷新内存,将数据写入文件,这样导致打印时,占用的CPU,和内存很少。但有人会说了,我用过这个类啊,他好像并不能完全解决,当数据量超过一定量后还是会内存溢出的,而且时间还很长。对你只是用了这个类,但是你并没有针对你的需求进行相应的设计,仅仅是用了,所以接下来我要说的问题就是,如何通过SXSSFWorkbook以及相应的写入设计来实现百万级别的数据快速写入。

v修改pom.xml

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency>

v添加controller

package com.demo.controller;import com.demo.pojo.UserDetails;
import com.demo.service.UserService;
import org.apache.poi.hssf.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;
import java.util.List;/*** Created by toutou on 2018/11/3.*/
@Controller
public class FileController {@AutowiredUserService userService;@RequestMapping(value = "export")public void Export(HttpServletResponse response) throws IOException {HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("信息表");List<UserDetails> classmateList = userService.getUserDetails();// 设置要导出的文件的名字String fileName = "users"  + new Date() + ".xls";// 新增数据行,并且设置单元格数据int rowNum = 1;// headers表示excel表中第一行的表头 在excel表中添加表头String[] headers = { "id", "uid", "地址", "城市"};HSSFRow row = sheet.createRow(0);for(int i=0;i<headers.length;i++){HSSFCell cell = row.createCell(i);HSSFRichTextString text = new HSSFRichTextString(headers[i]);cell.setCellValue(text);}//在表中存放查询到的数据放入对应的列for (UserDetails item : classmateList) {HSSFRow row1 = sheet.createRow(rowNum);row1.createCell(0).setCellValue(item.getId());row1.createCell(1).setCellValue(item.getUid());row1.createCell(2).setCellValue(item.getAddress());row1.createCell(3).setCellValue(item.getCity());rowNum++;}response.setContentType("application/octet-stream");response.setHeader("Content-disposition", "attachment;filename=" + fileName);response.flushBuffer();workbook.write(response.getOutputStream());}
}

v运行与调试

v源码地址

https://github.com/toutouge/javademo/tree/master/hellospringboot

其他参考原文资料:

  • HSSFWorkbook (POI API Documentation) http://poi.apache.org/apidocs/dev/org/apache/poi/hssf/usermodel/HSSFWorkbook.html
  • JAVA使用POI如何导出百万级别数据 https://blog.csdn.net/happyljw/article/details/52809244

作  者:请叫我头头哥
出  处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!

转载于:https://www.cnblogs.com/toutou/p/9857963.html

SpringBoot入门教程(十四)导出Excel相关推荐

  1. SpringBoot入门教程(十)应用监控Actuator

    Actuator可能大家非常熟悉,它是springboot提供对应用自身监控,以及对应用系统配置查看等功能.spring-boot-starter-actuator模块的实现对于实施微服务的中小团队来 ...

  2. SpringBoot入门教程(十五)集成Druid

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...

  3. OPENCV入门教程十四:medianBlur中值平滑

    一.目标 学习如何使用opencv中的函数,学习对图像的中值平滑操作,学习medianBlur()函数的使用 二.函数说明 函数原型: void medianBlur(InputArray src, ...

  4. 【QT】QT从零入门教程(十四):标准颜色对话框类QColorDialog

      Qt中提供了一些标准的对话框,用于实现一些常用的预定义功能,本节要讲的是颜色对话框QColorDialog,它是在标准文件对话框的基础之上添加一些布局实现的. 测试程序: QColor color ...

  5. Webpack入门教程十四

    77.在webpack.config.js中添加minify,设置removeComments为true,删除模板中的注释,修改内容如下 var webpack = require('webpack' ...

  6. Python3快速入门(十四)——Pandas数据读取

    Python3快速入门(十四)--Pandas数据读取 一.DataFrame IO 1.CSV文件 pandas.read_csv(filepath_or_buffer, na_values='NA ...

  7. 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处.   文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...

  8. SpringBoot入门之七 文件处理之Excel PDF

    SpringBoot入门之七 文件处理之Excel PDF 1. 整合EasyExcel 1.1 引入依赖 1.2.实体类 1.3 工具方法 1.4 业务服务类 1.5 测试类 源码地址 2. 整合i ...

  9. SpringBoot入门教程(转)

    SpringBoot入门教程 注:此文章转载于GitHub,但是原文章图片加载出错,因此我整理了一下,并非本人原创,在此感谢原作者! 附上原文视频课地址供大家学习: www.bilibili.com/ ...

  10. springboot 入门教程(4)--web开发(spring mvc和Thymeleaf模板,带源码)

    2019独角兽企业重金招聘Python工程师标准>>> 首先回顾下前几篇的内容:springboot 入门教程(1),springboot 入门教程-Thymeleaf(2), sp ...

最新文章

  1. 测试opencv-CUDA是否安装成功简单程序
  2. 你还不知道 Eureka 和 zookeeper 的区别吗?
  3. 使用Mysql数据库完成增删改查综合案例(JSP页面)
  4. [register]-ARMV8系统中通用寄存器和系统寄存器的介绍和总结
  5. OpenJudge 2739 计算对数
  6. 永洪Desktop交叉表怎么按月份汇总
  7. matlab2014a 3d标定,[转载]张的matlab摄像机标定
  8. Web通用令牌JwtBuilder
  9. 代码合并工具_11个代码质量审核和管理工具,程序员必备!
  10. gogs只支持mysql5.7_在docker中跑nginx,gogs,mysql服务
  11. 我的个人中心前端开发源代码_个人博客
  12. DB pivot unpivot
  13. 不使用额外空间交换2个数据的源代码
  14. 扇贝有道180929每日一句
  15. android 阅读器字体,为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块...
  16. 计算机主板故障检测维修,主板故障!教你如何用主板诊断卡检测维修电脑主板故障...
  17. 常用单片机模块(五)
  18. 计算机网络自顶向下方法(第六版) 课后题答案 | 第三章
  19. 抖音主页位置怎么自己创建服务器,抖音个人主页在哪?怎么设置?
  20. 只知道LinkedIn的你,错过了多少机会!美帝十大求职网站收好

热门文章

  1. date java format_java-DateFormat
  2. mysql改变授权_mysql8使用grant授权修改
  3. 动画效果之PC端 移动端 探照灯遮罩动画
  4. java sleep唤醒_[JavaEE]如何唤醒Sleep中的线程
  5. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_11-修改页面-前端-Api调用...
  6. 小D课堂 - 零基础入门SpringBoot2.X到实战_汇总
  7. 阶段3 2.Spring_02.程序间耦合_3 程序的耦合和解耦的思路分析1
  8. IOS学习之斯坦福大学IOS开发课程笔记(第六课)
  9. CSS 文档架构——便于读取
  10. 向java全台推送数据等