【Apache POI】百万级数据导出Excel,并含有折线等图表

   需求概要

        最近接到一个需求,概要来讲就是实现百万级数据导出Excel,并根据其中的数据项自动生成折线图等图表。经技术调研,针对内存、性能等要素,Apache POI此技术可完成此需求。


        Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式文件读和写的功能。 .NET的开发人员则可以利用NPOI(POI for .NET)来访问POI的功能。

   总结构

  • HSSF - 提供读写Microsoft Excel XLS 格式文件的功能。
  • XSSF - 提供读写Microsoft Excel OOXML XLSX 格式文件的功能。
  • HWPF - 提供读写Microsoft Word DOC 格式文件的功能。
  • XWPF - 提供读写Microsoft Word DOCX 格式文件的功能。
  • HSLF - 提供读写Microsoft PowerPoint格式文件的功能。
  • HDGF - 提供读Microsoft Visio格式文件的功能。
  • HPBF - 提供读Microsoft Publisher格式文件的功能。
  • HSMF - 提供读Microsoft Outlook格式文件的功能。

 结构图

Apache POI发行版支持多种文档文件格式。这种支持在几个Jar文件中提供。并不是每种格式都需要所有的Jar。下表显示了POI组件、Maven存储库标记和项目的Jar文件之间的关系。

组件应用类型Maven 工件名
POIFSOLE2 Filesystempoi
HPSFOLE2 Property Setspoi
HSSFExcel XLSpoi
HSLFPowerPoint PPTpoi-scratchpad
HWPFWord DOCpoi-scratchpad
HDGFVisio VSDpoi-scratchpad
HPBFPublisher PUBpoi-scratchpad
HSMFOutlook MSGpoi-scratchpad
DDFEscher common drawingspoi
HWMFWMF drawingspoi-scratchpad
OpenXML4JOOXMLpoi-ooxml plus either poi-ooxml-lite or
poi-ooxml-full
XSSFExcel XLSXpoi-ooxml
XSLFPowerPoint PPTXpoi-ooxml
XWPFWord DOCXpoi-ooxml
XDGFVisio VSDXpoi-ooxml
Common SLPowerPoint PPT and PPTXpoi-scratchpad and poi-ooxml
Common SSExcel XLS and XLSXpoi-ooxml


该表将工件映射到jar文件名中。“版本yyyymmdd”是POI版本戳。

Maven 工件名先决条件
poi

log4j 2.x, commons-codec, 

commons-collections, 

commons-math3 commons-io

poi-scratchpadpoi
poi-ooxml

poi, poi-ooxml-lite, commons-compress,

 SparseBitSet
For SVG support: batik-all, xml-apis-ext, 

xmlgraphics-commons
For PDF support: pdfbox, fontbox, 

rototor graphics2d

poi-ooxml-litexmlbeans
poi-examplespoi, poi-scratchpad, poi-ooxml
poi-ooxml-full (known as ooxml-schemas)

xmlbeans
For signing: bcpkix-jdk18on, bcprov-jdk18on,

 xmlsec, slf4j-api

注意:
在POI4.0.0中添加了Apache commons-math3和commons-compression作为依赖项。
Zaxxer SparseBitSet被添加为POI 4.1.2中的依赖项
在POI 5.1.0中添加了Apache commons io作为依赖项


问题:

1.利用poi生成excel折线图,图无法在office excel中显示【发现...中的部分内容有问题。是否让我们尽量尝试恢复?如果您信任此工作簿的源,请单击“是”】

        排查问题发现:Office Excel版本为最新:(现版本为MS 365系列,Excel版本为2311.)而Apache POI相关依赖过旧,更新为最新依赖,则排除此问题。

2.【ERROR】apache POI java.lang.NoClassDefFoundError: org/apache/commons/compress/archivers/zip/ZipFile

        调整相关依赖版本为最新:

 <!--poi--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-lite</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-full</artifactId><version>5.2.5</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.25.0</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>5.2.0</version></dependency>

3.大量数据导出注意使用SXSSFWorkbook处理Excel文件(.xlsx)的工作簿

  • XSSFWorkbook:XSSFWorkbook是POI中的XLSX格式(Excel 2007及更高版本)的工作簿实现。它使用XML文件格式存储数据,并且在内存中将整个工作簿加载到内存中进行操作。这意味着对于大型或复杂的Excel文件,可能会占用大量的内存。
  • SXSSFWorkbook:SXSSFWorkbook是POI中的SXSSF流式工作簿实现。它专为处理大型Excel文件而设计,并通过限制内存使用来提供更好的性能和可伸缩性。它使用一种称为流式写入(Streaming Write)的技术,在内存中只保留一部分数据,然后将其写入硬盘,以便在需要时释放内存。

主要区别:

  • 内存占用:XSSFWorkbook会将整个工作簿加载到内存中,而SXSSFWorkbook只保留部分数据,将剩余数据写入硬盘。
  • 性能和可伸缩性:SXSSFWorkbook在处理大型Excel文件时可以获得更好的性能和可伸缩性,因为它可以有效地处理大量数据而无需消耗大量内存。
  • 使用场景:如果处理的Excel文件较小或简单,可以使用XSSFWorkbook。如果需要处理大型Excel文件或需要更好的性能和可伸缩性,则可以考虑使用SXSSFWorkbook。

        总之,XSSFWorkbook适用于较小的Excel文件,而SXSSFWorkbook适用于大型或复杂的Excel文件。选择哪个取决于具体需求和资源限制。当然亦可选取学习成本更低且对内存消耗更低的EasyExcel实现大数据导出

4.【ERRO】Exception in thread "Thread-0" org.apache.poi.ooxml.POIXMLException:org.apache.poi.openxml4j.exceptions.InvalidOperationException: You can't add a part with a part name derived from another part ! [M1.11]

        注意POI中XSSFWorkbook不可采用多线程写入不同sheet:

5.SXSSFDrawing不可生成Chart图表,XSSFDrawing可实现此功能。

        SXSSFDrawing是Apache POI库中的一种轻量级方式来处理大型Excel文件,它主要用于写入和操作Excel文件,而不是生成图表。可以使用XSSFWorkbookXSSFSheet类来创建图表,并使用相应的数据填充图表。

6.SXSSFWorkbook的close和dispose

        Apache POI库中的SXSSFWorkbook(Streaming Usermodel for Excel)是一种用于处理大型Excel文件的类,特别适用于内存有限的情况。它通过限制在内存中保持的数据行数来实现流式写入。

1. `close()`方法:
   - 当你完成对工作簿的所有操作后,应调用`close()`方法。此方法会将任何未写出到磁盘的剩余数据强制写出,并关闭所有相关的资源,如临时文件等。
   - 如果不调用`close()`,可能会导致部分数据未被正确保存到输出文件,或者占用的系统资源没有被释放。

2. `dispose()`方法:
   - 在POI 5.0.0版本之后,SXSSFWorkbook引入了`dispose()`方法作为替代`close()`的方法。
   - `dispose()`方法同样用于清理和关闭SXSSFWorkbook对象,确保所有数据都被妥善地写出,并释放与之关联的资源。
   - 官方推荐使用`dispose()`而不是`close()`,因为`dispose()`在内部会更彻底地清理资源,特别是对于SXSSF工作簿来说,可以更有效地管理其使用的临时文件。

总结:在使用完SXSSFWorkbook后,建议调用`dispose()`方法以确保所有数据被正确写入并释放资源。在旧版本POI中如果不存在`dispose()`,则应该调用`close()`。

7.利用XSSFWorkbook生成图表,导致系统堆内存剧增

  • org.apache.xmlbeans.impl.store.ElementXobj    347,831,616 B (21.1%)    3,623,246 (11.1%)
  • org.apache.xmlbeans.impl.store.AttrXobj    314,479,968 B (19%)    3,275,833 (10%)
  • byte[]    286,741,680 B (17.3%)    5,227,004 (15.9%)

        经过研究POI API文档发现,SXSSFWorkbook可利用getXSSFWorkbook方法获取XSSFSheet,之前由于不了解POI,为了利用XSSFSheet生成图表,竟然玩起了俄罗斯套娃,将SXSSFWorkbook写入ByteArrayOutputStream流中,再通过构造器new XSSFWorkbook(new ByteArrayInputStream(baos.toByteArray()))获取XSSFWorkbook对象,进而生成图像,导致JVM堆内存剧增!

       致使内存剧增的代码:

ByteArrayOutputStream baos = new ByteArrayOutputStream();try {wb.write(baos);} catch (IOException e) {e.printStackTrace();}try {xssfWB = new XSSFWorkbook(new ByteArrayInputStream(baos.toByteArray()));for (DeviceInfoBO item : deviceInfoBOList) {XSSFSheet xssfSheet = xssfWB.getSheet(item.getSheetName());//TODO 生成图表}return new SXSSFWorkbook(xssfWB);} catch (IOException e) {e.printStackTrace();}

        优化后的代码:

XSSFSheet xssfSheet = wb.getXSSFWorkbook().getSheet(deviceInfoBO.getSheetName());
//TODO 生成图表

        优雅从不过时~

        效果图:

参考资料:

Apache POI简介icon-default.png?t=N7T8https://en.wikipedia.org/wiki/Apache_POIApache POI官网icon-default.png?t=N7T8https://poi.apache.org/index.htmlApache POI官网代码示例icon-default.png?t=N7T8https://svn.apache.org/repos/asf/poi/trunk/poi-examples/src/main/java/org/apache/poi/examples/

stackoverflow相关BUG解决icon-default.png?t=N7T8https://stackoverflow.com/questions/52381075/apache-poi-java-lang-noclassdeffounderror-org-apache-commons-compress-archivers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/654316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 覆盖索引

目录 一、什么是索引 二、索引的有哪些种类&#xff1f; 三、InnoDB的不同的索引组织结构是怎样的呢&#xff1f; 四、什么是覆盖索引 五、如何使用是覆盖索引&#xff1f; 六、如何确定数据库成功使用了覆盖索引呢 总结&#xff1a; 一、什么是索引 索引&#xff08;在 …

Redis高级特性

文章目录 1.4.1 Redis的缓存过期淘汰策略1.4.1.1 Redis内存满了怎么办1.4.1.2 过期策略1.4.1.3 缓存淘汰策略1.4.1.3.1 Redis 中LRU设计1.4.1.3.2 Redis 中LFU设计 1.4.2 持久化机制1.4.2.1 持久化流程1.4.2.2 RDB1.4.2.3 AOF1.4.2.3.1 AOF运行原理1.4.2.3.2 AOF文件重写原理 1…

PowerBI商业智能分析引入,带你了解什么是商务智能

一、商务智能工具 什么是Power BI &#xff1f;Power Bl是微软开发的一个软件&#xff0c;它是从获取数据、数据清洗、数据图表搭建、数据分析、共享发布为一体的软件&#xff0c;无论你的数据是简单的Excel电子表格&#xff0c;还是复杂庞大的数据库&#xff0c;Power Bl都可…

智慧文旅:提升旅游体验与推动经济发展的新动力

一、智慧文旅的定义与意义 智慧文旅&#xff0c;即智慧文化旅游&#xff0c;是一种以当地特色文化元素为核心驱动&#xff0c;利用现代科技手段实现旅游景区全面智慧升级的旅游模式。其意义在于为游客提供高效便捷的旅游信息化服务&#xff0c;提升旅游体验&#xff0c;同时推…

Go语言基础之单元测试

1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的&#xff0c;并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的源代码文件都是go …

【Linux】Linux权限的概念 -- 详解

一、Linux 中的用户 Linux 下有两种用户&#xff1a; 超级用户&#xff08;root&#xff09;&#xff1a;可以在 Linux 系统下做任何事情&#xff0c;不受限制。普通用户&#xff1a;在 Linux 下做有限的事情。 超级用户的命令提示符是 “#”&#xff0c;普通用户的命令提示符…

解读BEVFormer,新一代自动驾驶视觉工作的基石

文章出处 BEVFormer这篇文章很有划时代的意义&#xff0c;改变了许多视觉领域工作的pipeline[2203.17270] BEVFormer: Learning Birds-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers (arxiv.org)https://arxiv.org/abs/2203.17270 BEV …

ESP8266 控制之 : 使用 RingBuffer USART1 和 USART3互传

简介 使用Buffer来避免数据的丢失, 或许你自己在使用串口进行收发时会丢失数据, 现在我们就来简单使用一下RingBuffer创建Rx、Tx的Buffer来避免发送接收丢包或数据丢失问题。 扩展知识 RingBuffer的介绍, 看完大概也就知道了&#xff0c;实在不知道就看看下面的代码 线路连接…

使用antdesign3.0、echarts制作固定资产后台管理系统原型

学了半个月Axure,周末用半天时间&#xff0c;照着网上的模板做了一个固定资产后台管理系统的原型。重点是内联框架的使用&#xff0c;和对echarts表格js代码的调试。原型链接&#xff1a;https://qoz5rv.axshare.com 资产管理系统

SD NAND的CLK引脚的注意事项和走线规范

CLK的作用和注意事项 SD NAND的时钟引脚&#xff08;CLK&#xff09;的作用是提供一个时钟信号&#xff0c;用于同步数据传输。时钟信号是由主设备&#xff08;如微控制器或存储控制器&#xff09;提供的&#xff0c;用于确保SD NAND和主设备之间的数据交换是按照相同的时序进…

力扣hot100 子集 回溯 超简洁

Problem: 78. 子集 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考题解 复杂度 时间复杂度: 添加时间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) 空间复杂度: 添加空间复杂度, 示例&#xff1a; O ( n ) O(n) O(n) Code class Solution {List<Li…

【Javaweb程序】【C00155】基于SSM的旅游旅行管理系统(论文+PPT)

基于SSM的旅游旅行管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于SSM的旅游旅行管理系统 本系统分为前台系统模块、管理员模块、用户模块以及商家模块 其中前台系统模块的权限为&#xff1a;当游客打开系统的网址后…

Docker本地部署APITable结合内网穿透实现公网访问

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c;是一款面向 API 的智能多维表格。它将复杂的可视化数据库、电子表格、实时在线协同、低代码开发技术四合为一&am…

luceda ipkiss教程 60:导入特定图层的GDS版图

在用GDSCell导入版图时&#xff0c;可以设置layer_map来选择导入特定图层的GDS文件&#xff0c; 比如&#xff1a;可以将教程57中的微环调制器生成gds文件&#xff1a;Ring_modulator.gds&#xff0c; 在导入Ring_modulator.gds做其他设计时&#xff0c;可以选择只导入波导部分…

高阶测试开发必备技能: k8s入门!

现在稍微有点规模公司都是基于docker容器化部署技巧&#xff0c;K8s现在主流&#xff0c;应用最广的容器集群管理技术。 k8s全称kubernetes&#xff08;首字母为 k、首字母与尾字母之间有 8 个字符、尾字母为 s&#xff0c;所以简称 k8s&#xff09;&#xff0c;基于Docker容器…

网络安全01--负载均衡

目录 一、环境准备 1.1三台虚拟机 二、开始搭建负载均衡&#xff1a; 2.1准备一下源 2.2正式安装 2.3Nginx安装情况 三、负载均衡--轮询&#xff08;round robin&#xff09; 3.1在 http 部分添加如下负载均衡配置&#xff1a; 3.2简单解释一下server端&#xff1a; …

JS-Window常见对象

location对象 location的数据类型是对象&#xff0c;它拆分并保存了URL地址的各个组成部分 常用属性和方法&#xff1a; 1&#xff09;href属性获取完整的URL地址&#xff0c;对其赋值时用于地址的跳转 //可以得到当前文件URL地址 console.log(location.href) //可以通过js…

GPT-SoVITS 测试

开箱直用版&#xff08;使用 AutoDL&#xff09; step1 打开地址 https://www.codewithgpu.com/i/RVC-Boss/GPT-SoVITS/GPT-SoVITS-Official 选择 AutoDL创建实例&#xff0c;选择 3080ti 机器 step2 创建好实例之后&#xff0c;进入命令行&#xff0c;输入命令 echo {}>…

防御保护--智能选路

目录 就近选路 策略选路--PBR DSCP优先级 智能选路--全局路由策略 1.基于链路带宽的负载分担 2.基于链路质量进行负载分担 3.基于链路权重进行负载分担 4.基于链路优先级的主备备份 ​编辑 DNS透明代理 就近选路 我们希望在访问不同运营商服务器时&#xff0c;通过对…

使用机器学习算法检测交易中的异常行为

交易中的异常检测意味着识别交易或相关活动中的异常或意外模式。这些模式被称为异常或异常值&#xff0c;明显偏离预期规范&#xff0c;可能表明存在不规则或欺诈行为。 异常检测在各种业务中发挥着至关重要的作用&#xff0c;尤其是那些涉及金融交易、在线活动和安全敏感操作…