`
li_sir
  • 浏览: 115390 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

POI导出报表总结

    博客分类:
  • java
 
阅读更多
监控报表基于POI导出EXCEL总结

POI操作EXCEL对象
HSSF:操作Excel 97(.xls)格式
XSSF:操作Excel 2007 OOXML (.xlsx)格式,操作EXCEL内存占用高于HSSF
SXSSF:从POI3.8 beta3开始支持,基于XSSF,低内存占用。
1. 实现原理
基于EXCEL配置模板进行报表导出,实现导出EXCEL字段灵活配置及格式的丰富化。

模板格式
根据程序设定的模板,先解析模板,将参数(以$P开头)单元格、静态数据(无需变更)单元格及数据列(以$F开头)单元格分别存放到对应的集合对象。再根据准备好的EXCEL数据,生成一个EXCEL对象,根据参数单元格集合、静态数据单元格集合及数据列单元格集合进行数据填充,最后将EXCEL转换成流的形式响应到浏览器,提供给用户下载。
2. 监控报表导出EXCEL历程
 使用POI的HSSF对象,生成Excel 97(.xls)格式,数据库查询不进行分页、生成的EXCEL不经过压缩直接导出。
线上问题:负载服务器转发请求到应用服务器阻塞。
 数据库分页查询、并在服务端对生成的EXCEL进行压缩后导出
线上问题:不能满足生产需求、配置framework-agent.jar后,LIST集合超过10万条异常,不能导出。
 改用XSSF操作EXCEL,增加最大条数,并发量控制
线上问题:内存溢出
 使用SXSSF对象操作EXCEL,对程序进行优化、对文件流极端情况下是否关闭进行检查,
线上问题:暂时无
3. 优化总结
 通过数据库查询导出报表时,数据库要进行分页查询,分多次生成报表(并非生成多个excel文件或者sheet页,而是追加的形式生成一个sheet页)。
如果未分页,一次查出上万条数据,甚至更高,会长时间占用数据库连接,导致系统并发量下降。另外、由于一次加载数据过多(数据库查询的数据通常会放入到java的一个集合),会长时间占用虚拟机的堆内存,直到生成EXCEL结束,GC才有可能对此集合对象进行回收,这样并发量大时,很容易造成堆内存溢出。在数据库分页查询过程中,每页建议在5000左右,实践证明,生成EXCEL过程,时间主要花费在了数据库查询上,写EXCEL是很快的,所以如果每页条数太小,要查询多次数据库,数据库查询是比较耗时的,这样整体生成EXCEL的时间要长。
 如果系统存在大数据量报表导出,则考虑使用POI的SXSSF进行EXCEL操作。
HSSF生成的Excel 97(.xls)格式本身就有每个sheet页不能超过65536条的限制。
XSSF生成Excel 2007 OOXML (.xlsx)格式,条数增加了,但是导出过程中,内存占用率却高于HSSF.
SXSSF是自3.8-beta3版本后,基于XSSF提供的低内存占用的操作EXCEL对象。其原理是可以设置或者手动将内存中的EXCEL行写到硬盘中,这样内存中只保存了少量的EXCEL行进行操作。
 导出数据量大,服务器端要对导出的EXCEL进行压缩后,再转成二进制流,响应给浏览器
EXCEL的压缩率特别高,能达到80%,12M的文件压缩后才2M左右。 如果未经过压缩、不仅会占用用户带宽,且会导致负载服务器(apache)和应用服务器之间,长时间占用连接(二进制流转发),导致负载服务器请求阻塞,不能提供服务。
 如果应用使用进思的framework-agent.jar,尽量不要使用HSSF对象操作EXCEL
HSSF操作EXCEL对象时,内部会使用一个List集合,存放EXCEL的所有单元格对象,这时就要注意所操作的EXCEL行数*列数,不能超过framework-agent.jar所设置的数量。
 一定要注意文件流的关闭
打开一个流文件,不能只想着在正常情况下正常关闭,一定要注意在各种异常情况下,把流文件给关闭,否则很容易造成内存泄露。在关闭流文件时,建议在调用close方法后,再将该文件置为null。因为在使用中发现,在内部对文件流关闭后,再在外围判断该文件流对象是否为空,不为空调用close方法,仍然会被执行。所以为保万无一失,在调用close方法后,在将其设置为Null。
 防止前台(页面)连续触发导出EXCEL
导出大数据量的EXCEL,在后台是比较耗时的,也比较耗IO资源,这时应避免用户在等待的过程中,再次触发导出EXCEL操作,所以在触发导出EXCEL后,应将导出按钮置为不可用状态。(一旦触发导出EXCEL,TOMCAT导出EXCEL线程不会因为用户关掉页面或者转向其他页面而停止,会直至整个过程执行完)
 导出并发量限制及最大条数限制
导出EXCEL过程,IO操作及循环写入EXCEL比较耗操作系统资源,所以要限制每个实例导出EXCEL的并发数,监控报表并发量限制为15,当超过15时,会给用户提示,引导其重新发起导出EXCEL,这样可能会负载到其他实例,进行导出。
最大条数限制,是根据业务需求,做出合理的设置。导出的EXCEL,如果数据量过大,导出过程中耗时长,占用大量的系统资源,且导出来后,庞大的数据量,打开都比较困难,更不用说查看的意义了。所以要根据用户提供的导出参数,要首先查出数据条数,如果条数过大,直接给用户提示,避免在极端情况或者不正常情况,浪费系统资源。

监控报表通过以上优化、现在导出报表基本稳定、可以支持最大15万条数据导出,不再出现内存溢出、阻塞响应等情况。


分享到:
评论
2 楼 jveqi 2015-02-07  
1 楼 liuhu2967 2014-01-14  
大哥,我想问你个问题,防止前台(页面)连续触发导出EXCEL ,关于这个,我也打算这么做,但怎么才知道导出已经完成了,再让按钮恢复为可用状态,不然的话,我如果需要继续导出,就得刷新页面。

相关推荐

    使用poi导出报表后,希望某一列为下拉列表

    使用poi导出报表后,希望某一列为下拉列表,可以更方便操作某一列为下拉框

    POI导出报表

    【POI导出报表】是Java开发中一个常见的任务,主要涉及如何利用Apache POI库来生成和导出Word、Excel以及PDF格式的报表。Apache POI是一个流行的开源项目,它为Microsoft Office文档(如Word、Excel)提供读写功能,...

    POI报表Word导出

    POI报表Word导出

    POI报表导出excel

    在这个“POI报表导出excel”的案例中,我们将深入探讨如何使用POI 3.6版本来实现报表的导出,包括设置Excel样式、合并单元格以及处理多表头的合并。 首先,我们需要了解Apache POI的核心组件:HSSFWorkbook(用于...

    POI导出Excel报表

    用于导入导出Excel,方便好用 支持动态用流写至客户端

    使用ITEXT导出PDF、WORD,APACHE POI导出EXCEL报表文件

    本文将深入探讨如何使用ITEXT库导出PDF和Word,以及利用Apache POI库导出Excel报表文件。 首先,让我们来了解ITEXT库。ITEXT是一个开源Java库,专门用于创建和修改PDF文档。使用ITEXT,你可以方便地生成包含文本、...

    poi导出cvs文件

    标题中的“poi导出csv文件”指的是使用Apache POI库来生成CSV(逗号分隔值)文件。Apache POI是Java中一个流行的库,它主要用于处理Microsoft Office格式的文件,如Excel。在这个场景中,我们将探讨如何使用POI来...

    poi导出excel参考方法

    POI导出Excel参考方法 POI(Poor Obfuscation Implementation)是一个Java的API,用于操作Microsoft Office文档,包括Excel、Word、PowerPoint等。下面是POI导出Excel参考方法的相关知识点: 1. POI的基本概念 ...

    POI导出Excel表格

    以下是关于POI导出Excel表格的相关知识点的详细解释。 1. **Apache POI库**: Apache POI 是一个开源项目,它提供了一组API用于读写Microsoft Office格式的文件,如Excel(XLS,XLSX),Word(DOC,DOCX)和...

    poi报表导入导出视频

    【标题】"poi报表导入导出视频"涉及的是Java编程中的Apache POI库,这个库主要用于处理Microsoft Office格式的文件,如Excel、Word和PowerPoint。在报表领域,POI库常常被用来进行数据的导入和导出操作,极大地提高...

    POI导出excle例子+代码+poi文档

    在“POI导出Excel例子”中,我们首先需要了解几个核心类: 1. **HSSFWorkbook**:这是用于创建Excel 2003(.xls)文件的工作簿对象。如果你需要创建Excel 2007及以上版本的.xlsx文件,你应该使用XSSFWorkbook类。 ...

    Apache之PoI 报表导出

    在"Apache之PoI 报表导出"这个主题中,我们将深入探讨如何利用Apache POI库将数据库中的数据高效地导出到Excel报表中。 1. **Apache POI简介** Apache POI是一个开源项目,它提供了API来创建、修改和显示Microsoft...

    apache POI 导出Excel 设置打印

    在使用Apache POI导出Excel时,首先需要创建一个`XSSFWorkbook`对象作为工作簿,然后通过工作簿创建`XSSFSheet`对象代表工作表。例如: ```java XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet =...

    POI导出.pdf,.doc,.xls,.jpg四种格式通用组件

    在描述中提到的"POI导出.pdf,.doc,.xls,.jpg四种格式通用组件",意味着该组件不仅限于处理Microsoft Office文档,还支持生成PDF和图像文件(如.jpg),实现了多种文件格式间的转换和导出。 1. **Apache POI 概述**...

    poi导出数据到excel里

    在这个场景中,"poi导出数据到excel里"指的是使用Apache POI库在Java项目中将数据写入Excel文件的过程。这个功能在数据分析、报表生成或者数据导出等场景中非常常见。以下是对Apache POI导出数据到Excel的详细解释:...

    poi导出,导出excel文件

    在“ poi导出,导出excel文件 ”这个主题中,我们将主要关注XSSF,因为它是现代Excel文件的标准。导出Excel文件的基本步骤如下: 1. **添加依赖**:首先,你需要在你的项目中引入Apache POI的依赖。如果你使用Maven...

    poi 导出 word 导出excel

    在使用Apache POI导出Excel时,你需要创建一个Workbook对象,这代表整个Excel工作簿。然后,你可以创建一个Sheet对象,代表Excel的一个工作表。在Sheet中,你可以创建Row对象来表示行,进一步在Row中创建Cell对象来...

    POI的EXCEL导出,自动换行

    ### POI的EXCEL导出,自动换行 在日常工作中,经常需要处理大量的数据导入导出任务,...无论是简单的数据导出还是复杂的报表生成,POI都能够提供相应的解决方案。希望本文能够帮助大家更好地理解和使用Apache POI。

    使用POI从数据库导出对应EXCEL格式数据

    在本场景中,我们探讨的是如何使用POI从数据库中导出数据并将其格式化为Excel文件供用户下载。以下是关于这个主题的详细解释: 1. **Apache POI介绍**: Apache POI是一个开源项目,它提供了API来处理Microsoft ...

    poi导出excel

    在Java编程环境中,POI提供了一种方便的方式来处理Excel数据,从而实现报表的生成和导出。本文将深入探讨如何使用Apache POI来导出Excel报表。 首先,我们需要在项目中引入Apache POI的相关依赖。如果是Maven项目,...

Global site tag (gtag.js) - Google Analytics