`

POI处理Excel大文件的问题和解决方法

 
阅读更多

    最近在测试上传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大文件.rar

    POI处理Excel大文件的问题和解决方法 来自 http://itindex.net/detail/52291-poi-excel-%E6%96%87%E4%BB%B6

    POI读取Excel大文件-输出cvs文件.rar

    POI处理Excel大文件的问题和解决方法,测试excel文件大小4.5M,14万条数据,没有问题。 将excel文件的内容转换成cvs格式文件

    poi:适合解析小的excel文件,文件稍微大一点就出现OOM。

    事件驱动解析是把文件转换成xml,然后一边读取一边解析,这样就对内存的占用就会很少,可以很好的处理poi出现OOM的问题。 maven添加需要的jar包 <groupId>org.apache.poi <artifactId>poi <version>3.15 ...

    poi大量数据读取gc内存溢出解决方案

    poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...

    POI读写海量Excel(详细解读)

    对Excel的读取,POI有两种模式,一是用户模式,这种方式同Jxl的使用很类似,使用简单,都是将文件一次性读到内存,文件小的时候,没有什么问题,当文件大的时候,就会出现OutOfMemory的内存溢出问题。第二种是事件...

    Java poi基于事件驱动读取excel 2007海量数据 处理空单元格

    该工具类是poi基于事件驱动去读取海量excel数据,解决内存溢出以及空单元格的问题。 该压缩包里面有两个文件,TestExcel.java主要是原始的处理方法,操作简单,适合小数据量的读取。 ExampleEventUserModelUtil.java...

    快速、简洁、解决大文件内存溢出的java处理Excel工具 .rar

    Alibaba EasyExcel:采用逐行读取的解析模式,将每一行的解析结果以观察者模式通知处理(AnalyEventListener),所以比较适合数据体量较大的Excel文件解析。 场景复现与问题定位 问题代码 这种方式POI会把文件的所有...

    minio使用,poi解析,uid生成工具,策略工厂模式,模板管理完整功能,swagger集成,跨域,异常处理,分页等可用源代码

    9、excel文件解析功能:poi实现。 10、minio分布式存储:API封装并提供统一的请求接口。包括minio部署说明,以及minio 使用源代码 注意:需要安装minio服务端,参见readme文档 11、跨域问题解决。 12、线程池应用。

    poi教程,用于java解析,excel文件转换

    poi教程,用于java解析,excel文件转换,在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中,常常有客户这样子要求:你要把我们的报表...

    EasyExcel是一个快速、简洁、解决大文件内存溢出的java处理Excel工具 .rar

    其中Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文件数据量不大的应用场景; EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑...

    快速、简洁、解决大文件内存溢出的java处理Excel工具

    但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。...

    poi3.9 jar包下载

    简而言之,您可以使用Java读取和写入MS Excel文件。此外,您可以使用Java读取和写入MS Word和MS PowerPoint文件。 Apache POI是您的Java Excel解决方案(适用于Excel 97-2008)。我们有一个完整的API用于移植其他...

    java多线程导出excel(千万级别)优化

    轻松解决普通poi形式导出Excel的中出现的栈溢出问题,此资源可实现千万级数据分批导出csv文件,csv大数据量导出(千万级别,不会内存溢出),多线程导出 ,生产环境已经很稳定的使用着

    数据库大量数据导出Excel

    由于之前接触过POI,对POI的一些特性还是有一定的了解的,因此顺其自然的用POI去解决这个问题。POI3.8版本之前的版本处理大量数据的导出Excel效果不是很理想,主要在与Excel2003版本单个Sheet的行限制为65536,大量...

    Excel报表完美解决方案

    java中输出到excel各种操作接口 如何用POI来读取/写入完整的Excel文件

    EasyExcel JAVA解析Excel工具 v3.3.4

    EasyExcel是一个快速、简洁、解决大文件内存溢出的java处理Excel工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但...

    EasyExcel JAVA解析Excel工具.rar

    github地址: GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具 1.2:Easy Excel特点 Java解析、生成Excel比较有名的框架有Apache poi、jxl,但他们都存在一个严重的问题就是非常的...

    多线程导出Excel(百万级别)_Java版优化.zip

    用开源 Apache POI 技术导出Excel,解决导出大数据出现OOM、栈溢出问题,此资源可实现百万级数据多线程分批导出Excel文件,不会内存溢出,生产环境已很稳定的使用者,所以用到的技术很核心、值得参考

    easyexcel:快速,简单避免OOM的java处理Excel工具

    所以建议加钉钉群JAVA解析Excel工具EasyExcel 但他们都存在一个严重的问题就是非常的耗电量,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是Java解析,生成Excel比较有名的框架有Apache poi...

Global site tag (gtag.js) - Google Analytics