最近在测试上传Excel2007大文件的功能,采用的是Apache POI工具。
Excel2007: 24M , POI :3.10
发现POI在处理24MExce2007l文件的时候,几乎占用了2G的Heap Space.
由于Excel2007的文件是经过压缩的,其实数据都是存放在shareStringl.xml文件中。
所以24M的文件,经过解压缩后,其实有160M的大小。
问题分析:
经过Debug发现,POI在处理shareString.xml文件的时候,Heap内存就一直在飙升.最后导致内存的溢出,只 能加大Heap Space.
而
问题:说明POI在处理Excel2007的时候占用了很大的内存,那么有没有更好的方法来读取Excel文件呢?
首先先去http://poi.apache.org/faq.html :这个是个常用的问题列表,在
14. I think POI is using too much memory! What can I do?
This one comes up quite a lot, but often the reason isn't what you might initially think. So, the first thing to check is - what's the source of the problem? Your file? Your code? Your environment? Or Apache POI?
.........
Next, use the example program ToCSV to try reading the a file in with HSSF or XSSF. Related is XLSX2CSV, which uses SAX parsing for .xlsx
我们看到了POI已经提出了针对这个问题的回答,而且正好在XLS2CSV中找到了很好的解决读取大容量的方法.
在XLS2CSV中,即使是读取300M的2007excel文件也没有什么问题,占用的内存也是可以接受的。
在这段代码中的注释中写出了下面一段话:
*Data sheets are read using a SAX parser to keep the
* memory footprint relatively small, so this should be
* able to read enormous workbooks. The styles table and
* the shared-string table must be kept in memory. The
* standard POI styles table class is used, but a custom
* (read-only) class is used for the shared string table
* because the standard POI SharedStringsTable grows
* very quickly with the number of unique strings.
大概的意思就是说通用的处理方法会快速消耗掉内存,所以采用了 SAX parser方法来处理大容量的文件.
public void processSheet(
StylesTable styles,
ReadOnlySharedStringsTable strings,
InputStream sheetInputStream)
throws IOException, ParserConfigurationException, SAXException {
InputSource sheetSource = new InputSource(sheetInputStream);
SAXParserFactory saxFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxFactory.newSAXParser();
XMLReader sheetParser = saxParser.getXMLReader();
ContentHandler handler = new MyXSSFSheetHandler(styles, strings, this.minColumns, this.output);
sheetParser.setContentHandler(handler);
sheetParser.parse(sheetSource);
}
上面的一段代码是比较核心的代码,通过SAXParser解析xml文件,尽量不占用内存资源,从而达到读取大文件的目的。
XLSX2CSV代码下载: http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java
相关推荐
POI处理Excel大文件的问题和解决方法 来自 http://itindex.net/detail/52291-poi-excel-%E6%96%87%E4%BB%B6
POI处理Excel大文件的问题和解决方法,测试excel文件大小4.5M,14万条数据,没有问题。 将excel文件的内容转换成cvs格式文件
事件驱动解析是把文件转换成xml,然后一边读取一边解析,这样就对内存的占用就会很少,可以很好的处理poi出现OOM的问题。 maven添加需要的jar包 <groupId>org.apache.poi <artifactId>poi <version>3.15 ...
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
对Excel的读取,POI有两种模式,一是用户模式,这种方式同Jxl的使用很类似,使用简单,都是将文件一次性读到内存,文件小的时候,没有什么问题,当文件大的时候,就会出现OutOfMemory的内存溢出问题。第二种是事件...
该工具类是poi基于事件驱动去读取海量excel数据,解决内存溢出以及空单元格的问题。 该压缩包里面有两个文件,TestExcel.java主要是原始的处理方法,操作简单,适合小数据量的读取。 ExampleEventUserModelUtil.java...
Alibaba EasyExcel:采用逐行读取的解析模式,将每一行的解析结果以观察者模式通知处理(AnalyEventListener),所以比较适合数据体量较大的Excel文件解析。 场景复现与问题定位 问题代码 这种方式POI会把文件的所有...
9、excel文件解析功能:poi实现。 10、minio分布式存储:API封装并提供统一的请求接口。包括minio部署说明,以及minio 使用源代码 注意:需要安装minio服务端,参见readme文档 11、跨域问题解决。 12、线程池应用。
poi教程,用于java解析,excel文件转换,在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中,常常有客户这样子要求:你要把我们的报表...
其中Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文件数据量不大的应用场景; EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑...
但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。...
简而言之,您可以使用Java读取和写入MS Excel文件。此外,您可以使用Java读取和写入MS Word和MS PowerPoint文件。 Apache POI是您的Java Excel解决方案(适用于Excel 97-2008)。我们有一个完整的API用于移植其他...
轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着
由于之前接触过POI,对POI的一些特性还是有一定的了解的,因此顺其自然的用POI去解决这个问题。POI3.8版本之前的版本处理大量数据的导出Excel效果不是很理想,主要在与Excel2003版本单个Sheet的行限制为65536,大量...
java中输出到excel各种操作接口 如何用POI来读取/写入完整的Excel文件
EasyExcel是一个快速、简洁、解决大文件内存溢出的java处理Excel工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但...
github地址: GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具 1.2:Easy Excel特点 Java解析、生成Excel比较有名的框架有Apache poi、jxl,但他们都存在一个严重的问题就是非常的...
用开源 Apache POI 技术导出Excel,解决导出大数据出现OOM、栈溢出问题,此资源可实现百万级数据多线程分批导出Excel文件,不会内存溢出,生产环境已很稳定的使用者,所以用到的技术很核心、值得参考
所以建议加钉钉群JAVA解析Excel工具EasyExcel 但他们都存在一个严重的问题就是非常的耗电量,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是Java解析,生成Excel比较有名的框架有Apache poi...