最近在测试上传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
相关推荐
在使用Apache POI处理Excel 2007的XML文件时,有以下关键概念: 1. **XSSFWorkbook**:这是POI中用于表示.xlsx文件的工作簿对象。通过这个对象,我们可以创建、读取和修改工作簿中的内容。 2. **SXSSF (Streaming ...
以下是对POI处理Excel和Word文件的一些核心知识点的详细解释。 1. **POI API大全**:POI提供了一系列的类和接口,例如`HSSFWorkbook`和`XSSFWorkbook`用于处理Excel的HSSF(旧版的Excel 97-2003)和XSSF(用于Excel...
然而,当处理大数据量的Excel文件时,POI可能会导致内存溢出(Out of Memory, OOM),因为默认情况下它会将整个工作簿加载到内存中。为了防止这种问题,我们需要采用优化策略来高效地处理大量数据。 1. **分块读取*...
为了解决这个问题,POI提供了SXSSF(Streaming Usermodel API)和XSSFEventUserModel API。这里的主题是利用XML格式解析大文件Excel,以提高读取速度。 标题和描述中的"xml格式解析"指的是XSSFEventUserModel API,...
7. **异常处理**:在处理Excel文件时,可能出现文件不存在、格式不正确、内存溢出等问题,需要适当地捕获并处理异常。 通过以上知识点的学习和实践,你将能够熟练地利用Java POI进行Excel数据的处理,无论是数据...
"poi操作Excel文件jar包"指的是包含Apache POI库的Java归档(JAR)文件,可以集成到Java项目中以实现Excel文件的处理功能。 1. **Apache POI 简介** Apache POI 是Apache软件基金会的一个顶级项目,最初由Markus ...
事件驱动解析是把文件转换成xml,然后一边读取一边解析,这样就对内存的占用就会很少,可以很好的处理poi出现OOM的问题。 maven添加需要的jar包 <groupId>org.apache.poi <artifactId>poi <version>3.15 ...
Apache POI是一个开源项目,主要用于读取和写入Microsoft Office格式...在JavaWeb项目中,结合POI处理Excel文件可以极大地提高数据导入导出的效率和灵活性。如果你正在处理这样的任务,了解和掌握POI将是非常有价值的。
Apache POI 是一个开源项目,专门用于处理 Microsoft Office 格式的文件,如 Word、Excel 和 PowerPoint。在本案例中,我们关注的是如何使用 Apache POI 库来导出 Excel 文件,特别是根据模板导出和简单列表导出。...
在Java开发中,Apache POI库是用于读写Microsoft Office格式文件的重要工具,尤其是处理Excel文件。本资源“POI读取Excel大文件.rar”主要关注如何使用Apache POI高效地处理大型Excel文件,避免内存溢出问题。下面将...
总之,`LeftoverDataException`是POI在处理Excel文件时遇到的一种错误,通常需要从文件本身、编码、单元格格式、代码逻辑以及内存分配等多个角度进行排查。通过以上建议,开发者应该能够找到解决问题的途径。如果...
在“poi读取excel文件实例”中,我们将讨论如何使用Apache POI API来读取和操作Excel 2007文件。以下是一些关键知识点: 1. **创建工作簿对象**:首先,你需要通过`WorkbookFactory`类的`create()`方法打开或创建一...
总之,Apache POI 是Java开发中处理Excel文件的强大工具,无论是读取用户上传的数据还是创建可下载的报表,都能提供高效且灵活的解决方案。通过熟练掌握POI,开发者可以轻松地将Excel集成到Web应用中,实现数据的...
- `POI实现Java程序操作Excel报表的应用分析.pdf`:该文档可能深入分析了在实际项目中如何利用POI处理Excel报表,包括性能优化和常见问题解决。 4. **poi3.7.zip**: 这是一个包含POI 3.7版本的压缩文件。开发者...
在日常工作中,经常需要处理大量的数据导入导出任务,尤其是在企业级应用开发中,Excel文件的处理成为了一项必不可少的能力。Apache POI项目提供了一系列用于读写Microsoft Office格式文件的Java API,其中包括对...
POI通过流式处理和分块读取策略,使得在Java中高效处理大数据量的Excel文件成为可能。 描述中提到的“源码运行所需要的lib包”,指示了我们需要从提供的链接下载依赖的库文件才能运行相关的Java代码。在Java开发中...
此外,有许多在线教程和博客文章介绍了如何使用POI处理Excel文件。 总之,Apache POI 3.7版提供了强大的工具来解析和操作Excel文件,尽管有其局限性,但仍然是Java开发者处理Excel数据的常用选择。通过理解其API和...
总之,这个项目是一个完整的Java解决方案,用于处理Excel文件的导入导出,同时具备用户友好的进度条显示。它利用了Apache POI的强大功能,结合maven的依赖管理,以及可能的GUI组件,提供了高效且直观的数据操作体验...
总之,通过集成Apache POI和BeanShell,JMeter可以轻松地处理Excel文件,实现数据读取和写入,这对于构建复杂和灵活的测试计划是非常有用的。不过,使用时要考虑性能和资源消耗,选择最适合的解决方案。
标题中的“poi读取Excel2007文件”指的是使用Apache POI库来处理Microsoft Office Open XML (OOXML) 格式的Excel文件,也就是.xlsx格式。Apache POI是Apache软件基金会的一个开源项目,它提供了Java API,使得开发者...