`

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文件.zip

    在使用Apache POI处理Excel 2007的XML文件时,有以下关键概念: 1. **XSSFWorkbook**:这是POI中用于表示.xlsx文件的工作簿对象。通过这个对象,我们可以创建、读取和修改工作簿中的内容。 2. **SXSSF (Streaming ...

    POI读取Excel大文件.rar

    在Java开发中,Apache POI库是用于读写Microsoft Office格式文件的重要工具,尤其是处理Excel文件。本资源“POI读取Excel大文件.rar”主要关注如何使用Apache POI高效地处理大型Excel文件,避免内存溢出问题。下面将...

    POI处理EXCEL和WORD文件的JAR包和资料详细

    以下是对POI处理Excel和Word文件的一些核心知识点的详细解释。 1. **POI API大全**:POI提供了一系列的类和接口,例如`HSSFWorkbook`和`XSSFWorkbook`用于处理Excel的HSSF(旧版的Excel 97-2003)和XSSF(用于Excel...

    POI导出Excel万级数据分页实现 解决内存溢出问题

    POI提供了SXSSF(Streaming Usermodel API)和XSSF(XML Spreadsheet API)两个模型,用于处理大Excel文件。XSSF适合小规模数据,因为它在内存中创建整个工作簿,而SXSSF适用于大规模数据,它只在内存中保留最近使用...

    java poi处理excel数据

    7. **异常处理**:在处理Excel文件时,可能出现文件不存在、格式不正确、内存溢出等问题,需要适当地捕获并处理异常。 通过以上知识点的学习和实践,你将能够熟练地利用Java POI进行Excel数据的处理,无论是数据...

    java poi 导入大数据量Excel数据 防止内存溢出处理.zip

    然而,当处理大数据量的Excel文件时,POI可能会导致内存溢出(Out of Memory, OOM),因为默认情况下它会将整个工作簿加载到内存中。为了防止这种问题,我们需要采用优化策略来高效地处理大量数据。 1. **分块读取*...

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

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

    poi操作Excel文件jar包

    "poi操作Excel文件jar包"指的是包含Apache POI库的Java归档(JAR)文件,可以集成到Java项目中以实现Excel文件的处理功能。 1. **Apache POI 简介** Apache POI 是Apache软件基金会的一个顶级项目,最初由Markus ...

    poi读取大文件Excel,使用xml格式解析,速度实测50mb文件13s,可指定sheet页内容,带工具类和测试类

    为了解决这个问题,POI提供了SXSSF(Streaming Usermodel API)和XSSFEventUserModel API。这里的主题是利用XML格式解析大文件Excel,以提高读取速度。 标题和描述中的"xml格式解析"指的是XSSFEventUserModel API,...

    POI导入excel大数据处理,支持excel2003,2007

    Apache POI是一个开源项目,主要用于读取和写入Microsoft Office格式...在JavaWeb项目中,结合POI处理Excel文件可以极大地提高数据导入导出的效率和灵活性。如果你正在处理这样的任务,了解和掌握POI将是非常有价值的。

    POI 导入Excel 提醒LeftoverDataException求帮助

    总之,`LeftoverDataException`是POI在处理Excel文件时遇到的一种错误,通常需要从文件本身、编码、单元格格式、代码逻辑以及内存分配等多个角度进行排查。通过以上建议,开发者应该能够找到解决问题的途径。如果...

    poi读取excel文件实例(兼容excel2007)

    在“poi读取excel文件实例”中,我们将讨论如何使用Apache POI API来读取和操作Excel 2007文件。以下是一些关键知识点: 1. **创建工作簿对象**:首先,你需要通过`WorkbookFactory`类的`create()`方法打开或创建一...

    POI解析excel文件

    总之,Apache POI 是Java开发中处理Excel文件的强大工具,无论是读取用户上传的数据还是创建可下载的报表,都能提供高效且灵活的解决方案。通过熟练掌握POI,开发者可以轻松地将Excel集成到Web应用中,实现数据的...

    POI操作EXCEL文件

    - `POI实现Java程序操作Excel报表的应用分析.pdf`:该文档可能深入分析了在实际项目中如何利用POI处理Excel报表,包括性能优化和常见问题解决。 4. **poi3.7.zip**: 这是一个包含POI 3.7版本的压缩文件。开发者...

    POI的EXCEL导出,自动换行

    在日常工作中,经常需要处理大量的数据导入导出任务,尤其是在企业级应用开发中,Excel文件的处理成为了一项必不可少的能力。Apache POI项目提供了一系列用于读写Microsoft Office格式文件的Java API,其中包括对...

    POI实现大数据量的excel文件解析

    POI通过流式处理和分块读取策略,使得在Java中高效处理大数据量的Excel文件成为可能。 描述中提到的“源码运行所需要的lib包”,指示了我们需要从提供的链接下载依赖的库文件才能运行相关的Java代码。在Java开发中...

    POI3.7Excel解析

    此外,有许多在线教程和博客文章介绍了如何使用POI处理Excel文件。 总之,Apache POI 3.7版提供了强大的工具来解析和操作Excel文件,尽管有其局限性,但仍然是Java开发者处理Excel数据的常用选择。通过理解其API和...

    poi导出excel2007

    在处理大量数据时,使用Java导出Excel文件可能会遇到内存溢出的问题,尤其是在导出Excel 2007(.xlsx格式)时更为常见。这是因为传统的`XSSFWorkbook`对象会将整个工作簿保存在内存中,导致内存消耗巨大。 #### ...

    POI实现Excel导入导出并附带加载进度条

    总之,这个项目是一个完整的Java解决方案,用于处理Excel文件的导入导出,同时具备用户友好的进度条显示。它利用了Apache POI的强大功能,结合maven的依赖管理,以及可能的GUI组件,提供了高效且直观的数据操作体验...

    poi读取Excel2007文件

    标题中的“poi读取Excel2007文件”指的是使用Apache POI库来处理Microsoft Office Open XML (OOXML) 格式的Excel文件,也就是.xlsx格式。Apache POI是Apache软件基金会的一个开源项目,它提供了Java API,使得开发者...

Global site tag (gtag.js) - Google Analytics