首页 > 编程语言 >java使用Workbook workbook = new XSSFWorkbook(inputStream);导出数据频繁GC

java使用Workbook workbook = new XSSFWorkbook(inputStream);导出数据频繁GC

时间:2024-04-18 09:57:01浏览次数:21  
标签:java inputStream Workbook SXSSFWorkbook workbook new XSSFWorkbook

由于xlsx底层使用xml存储,占用内存会比较大,官方也意识到这个问题,在3.8版本之后,提供了SXSSFWorkbook来优化写性能

原来代码

Workbook workbook = newXSSFWorkbook(inputStream);

优化后代码

Workbook workbook = new SXSSFWorkbook(new XSSFWorkbook(inputStream));

此处有坑,请往下看

坑一:为什么模板中的数据获取不到?

当你企图使用SXSSFWorkbook去加载一个已存在的Excel模板时,首先你应该用XSSFWorkbook去获取

   XSSFWorkbook(java.io.File file) 
   XSSFWorkbook(java.io.InputStream is) 
   XSSFWorkbook(OPCPackage pkg) 
   XSSFWorkbook(java.lang.String path)

上列举了常用的四种获取XSSFWorkbook的方式。接下来如果你要对这个Excel模板做大量行列操作时,如果用XSSF的create方法势必会导致内存溢出。于是我们要使用SXSSFWorkbook去完成这个操作。

根据我对SXSSFWorkbook的了解,它只会加载一部分数据到内存,其余的数据全部持久化到本次磁盘。

但是当你噼里啪啦对SXSSFWorkbook进行了一顿操作时,你会发现SXSSFSheet.getRow(0) = null

这是因为这些记录存在于XSSFWorkbook中,你需要用sxssfWorkbook.getXSSFWorkbook()方法去获取初始模板的行数据。

需要改成这样:
Workbook workbook = new SXSSFWorkbook(new XSSFWorkbook(inputStream)).getXSSFWorkbook();

坑二:报错:Attempting to write a row[0] in the range [0,0] that is already written to disk

目前还不清楚这个报错是什么原因 在网上搜索有人说是由于你用XSSFWorkbook获取Excel模板的时候已经存在了行,然后用SXSSFWorkbook在Create这行的时候会报这个错误

但是当我把Workbook workbook = newXSSFWorkbook(inputStream);改成Workbook workbook = new SXSSFWorkbook(new XSSFWorkbook(inputStream));后这个报错也随之解决了,why??

 

标签:java,inputStream,Workbook,SXSSFWorkbook,workbook,new,XSSFWorkbook
From: https://www.cnblogs.com/pan-my/p/18142871

相关文章

  • java代码审计跨站脚本(XSS)--反射型
    一、基础:跨站脚本(Xss)一、原理:恶意攻击者往web页面里插入恶意js代码,而在服务端没有对数据进行严格的过滤。当用户浏览页面时,js代码必须在该html页面中(hrml必须要存在这个而已艾玛),从而达到攻击用户的目的。(攻击者构造的的js代码会被当作正常的HTML、JS代码被解析,执行Js脚本实现攻......
  • 当 mysql-connector-java-5 遇上 MySQL8,终究还是错付了 → 门当户对真的很重要!
    开心一刻今天,老婆给我发消息老婆:老公,儿子从隔壁邻居家回来了老婆:是先打还是先洗?我:先洗吧,万一打错人了呢老婆:先洗脸吧,没错就边打边洗起因在我们的固有认知中, mysql-connector-java-5.x.x 连接的是 MySQL5 ,而 mysql-connector-java-8.x.x 连......
  • Java并发(二十五)----异步模式之生产者/消费者
    1.定义要点与Java并发(二十二)----同步模式之保护性暂停中的保护性暂停中的GuardObject不同,不需要产生结果和消费结果的线程一一对应这样的好处是消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据......
  • JavaScript初了解
    最近想写一个web应用,打算稍微学一下。本文是个人在学习过程中的笔记,目的是分享。本文的阅读对象是已经有一门编程语言的基础,想进一步大致了解JS语言的读者本文章不适合完全零基础且对前端毫无概念的伙伴。1、变量和数据类型//number数值型varmyNum=10//字符型varmyStr......
  • Java API之查询文档
    1、查询指定id文档importorg.elasticsearch.action.get.GetRequest;importorg.elasticsearch.action.get.GetResponse;importorg.elasticsearch.client.RequestOptions;importorg.util.ConnectElasticsearch;publicclassGetDoc{publicstaticvoidmain(Strin......
  • JavaFx项目打包成exe,并集成Jre,使Java项目在任意机器运行
    1.关键点:通过springboot打包插件,将项目依赖都打到一个jar包内。以下是pom配置文件:<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artif......
  • java多渠道消息推送-(微信公众号、钉钉、邮箱、系统内部、短信等)
    1.消息对象定义1.1 通用消息对象定义packagecom.yj.notice.message;importcom.yj.commons.tools.utils.DateUtils;importcom.yj.commons.tools.utils.StringUtil;importcom.yj.notice.costant.NoticeMethodEnum;importlombok.AllArgsConstructor;importlombok.Bu......
  • tomcat启动指定java版本
    linux上已经配置jdk1.8为全局变量,但是tomcat运行需要指定jdk11。那么我们在不影响全局JAVA_HOME变量的时候,需直接指定JAVA_HOME即可。[rootapache-tomcat-8.5.87]#java-versionjavaversion"1.8.0_211"Java(TM)SERuntimeEnvironment(build1.8.0_211-b12)JavaHotSpo......
  • SQL语法错误-java.sql.SQLSyntaxErrorException: You have an error in your SQL synt
    频繁爆出这样的错误:java.sql.SQLSyntaxErrorException:YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear''atline1查阅了许多资料后,我怀疑报错可能与字段名不小心用了关键字有关......
  • java使用监听统计网站信息,并获取session中对应的ip
    用javalistener统计在线人数,并获取session中对应的ip在web.xml中添加。注意放到<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>spring监听器之后,否则会报错<listener><listener-class>com.......