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

标签: poi excel 文件 | 发表时间:2014-12-24 22:21 | 作者:nergpchen
出处:http://www.iteye.com

    最近在测试上传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

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [poi excel 文件] 推荐:

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

- - 编程语言 - ITeye博客
    最近在测试上传Excel2007大文件的功能,采用的是Apache POI工具.     发现POI在处理24MExce2007l文件的时候,几乎占用了2G的Heap Space..     由于Excel2007的文件是经过压缩的,其实数据都是存放在shareStringl.xml文件中.

POI Excel导入导出 - milan's

- - 博客园_首页
   基本思路:点击导出后生成临时.xls文件,返回文件名,供用户下载,下载完后删除文件.    带查询的导出(前端EasyUI),如下为导出界面图.   下面为导出按钮绑定的函数:. var exportCondition={};//导出条件.      //按条件进行查询数据,首先我们得到数据的值.

使用POI操作Excel和Word

- - ITeye博客
前言:今天在项目中看到有小模块是上传Excel解释后保存到数据库的操作,好奇之下去了解了如何使用Apache POI操纵Excel和Word,以下为小分享.       POI是Apache下的一个项目,是用Java编写的开源框架,提供API供开发者直接操作Microsoft Office(Excel,Word,PowerPoint...).

POI读写Word docx文件

- - 开源软件 - ITeye博客
使用 POI 读写 word docx 文件. 1     读docx文件. 1.1     通过XWPFWordExtractor读. 1.2     通过XWPFDocument读. 2     写docx文件. 2.1     直接通过XWPFDocument生成. 2.2     以docx文件作为模板.

解决POI大数据导出Excel内存溢出、应用假死

- - IT瘾-bigdata
最近公司一个06年统计项目在导出Excel时造成应用服务器内存溢出、假死现象;查看代码发现问题一次查询一整年的数据导致堆内存被撑爆(假死),随后改用批量查询往Excel中写数据,同样的问题又出现了. 随后在网上查阅了部分资料只是在POI大数据导出API的基础上写的demo示例无任何参考价值….

利用kettle组件导入excel文件到数据库

- - CSDN博客数据库推荐文章
利用kettle组件导入excel文件到数据库.        把excel文件内容导入到目标表中;然后用java调用kettle的转换. excel文件的内容只有两列,示例如下:.        数据库表的结构如下:. 使用oracle函数解决上图黄色行的字段:两个uuid和两个系统日期;. 需要生成uuid,这个在oracle中可以利用SYS_UUID()函数实现;.

PHP导出excel

- syeye - scofield PHP开发-SEO SEM
最近做一个项目,其中涉及到了数据导成excel的功能. 后来使用了 开源的 PHPExcel  http://phpexcel.codeplex.com/ 目前最新版是1.7.6. PHPExcel 可以生成 .xls 和 .xlsx (office2007). 比如设置 excel的title,keywords,description.

解决birt分组后,excel类型文件会多一行空白行的问题

- - 开源软件 - ITeye博客
    通过birt下载含有分组的报表后,会发现,在分组字段的后面会多出一行空白行,看上去很丑,在查阅很多资料后,才有现在的解决方法.     那就是把分组的那一行去掉,将分组的字段融合进详情那一行. 通过脚本判断,当前这一行的分组的数据是否等于上一行的数据. 比如我这有一张报表,按照订单号分组显示.

[简单] poi word2007简单图文混排

- - ITeye博客
       直接上代码:. POI_图文混排_S3_Test t = new POI_图文混排_S3_Test();. setTextFontInfo(p, false, false, "基本实验技能(常见实验仪器及基本操作)", "宋体", "000000",. setTextFontInfo(p, false, false, "班级:________.

Java读写Excel:Apache POI, JXL与OpenCSV

- - ITeye博客
前些日子把JXL替换为ApachePOI,原因很简单,JXL在2009年10月已经停止更新,并且不支持Excel 2007 OOXML (.xlsx)格式的文件. 事实上把JXL与POI进行比较并不公平,因为JXL只能够操作OLE2格式的Excel(即.xls),而POI则是能够读写xls(x)、doc(x)、ppt(x)的一整套解决方案.