在使用POI读取比较大的Excel文件时,发生了OutMemory异常,没办法只能改为使用Event API。
相对于user model,event user model使用起来稍微繁琐一些。
下面为简单的使用示例
读取文件
File file = new File("c:\\test.xls");
FileInputStream fis = new FileInputStream(file);
POIFSFileSystem pfs = new POIFSFileSystem(fis);
InputStream is = pfs.createDocumentInputStream("Workbook");
HSSFRequest request = new HSSFRequest();
//这儿为所有类型的Record都注册了监听器,如果需求明确的话,可以用addListener方法,并指定所需的Record类型
request.addListenerForAllRecords(new MyListener());
HSSFEventFactory factory = new HSSFEventFactory();
factory.processEvents(request, is);
fis.close();
is.close();
监听器:
public class MyListener implements HSSFListener {
//记录下来字符串表
private SSTRecord strRec;
public void processRecord(Record record) {
switch (record.getSid()){
case BOFRecord.sid:
BOFRecord br = (BOFRecord)record;
switch (br.getType()) {
case BOFRecord.TYPE_WORKBOOK: //顺序进入新的Workbook
System.out.println("新しいワークブック");
break;
case BOFRecord.TYPE_WORKSHEET://顺序进入新的Worksheet,因为Event API不会把Excel文件里的所有数据结构都关联起来,所以这儿一定要记录现在进入第几个sheet了。
System.out.println("新しいシート");
break;
}
break;
case BoundSheetRecord.sid: //记录sheet,这儿会把所有的sheet都顺序打印出来,如果有多个sheet的话,可以顺序记入到一个List里
BoundSheetRecord bsr = (BoundSheetRecord) record;
System.out.println("シート:"+bsr.getSheetname());
break;
case SSTRecord.sid: //记录字符串表
strRec = (SSTRecord)record;
System.out.println("文字列配列を発見。");
break;
case RowRecord.sid: //打印行,这个用处不大
RowRecord rr = (RowRecord) record;
System.out.println("行:"+rr.getRowNumber()+"。 開始列:"+rr.getFirstCol()+", 終了列:"+rr.getLastCol());
break;
case NumberRecord.sid: //发现数字类型的cell,因为数字和日期都是用这个格式,所以下面一定要判断是不是日期格式,另外默认的数字也会被视为日期格式,所以如果是数字的话,一定要明确指定格式!!!!!!!
NumberRecord nr = (NumberRecord)record;
if(HSSFDateUtil.isInternalDateFormat(nr.getXFIndex())){
System.out.println("日付:"+(new SimpleDateFormat("yyyy-MM-dd")).format(HSSFDateUtil.getJavaDate(nr.getValue()))
+", 行:"+nr.getRow()+ ", 列:"+nr.getColumn()+"。("+nr.getXFIndex()+")");
}else{
System.out.println("数字:"+nr.getValue()+", 行:"+nr.getRow()+ ", 列:"+nr.getColumn()+"。("+nr.getXFIndex()+")");
}
break;
case LabelSSTRecord.sid: //发现字符串类型,这儿要取字符串的值的话,跟据其index去字符串表里读取
LabelSSTRecord lsr = (LabelSSTRecord)record;
System.out.println("文字列:"+strRec.getString(lsr.getSSTIndex())+", 行:"+lsr.getRow()+", 列:"+lsr.getColumn());
break;
case BoolErrRecord.sid: //boolean or error
BoolErrRecord ber = (BoolErrRecord)record;
if(ber.isBoolean()){
print("Boolean:"+ber.getBooleanValue()+", 行:"+ber.getRow()+", 列:"+ber.getColumn());
}
if(ber.isError()){
print("Error:"+ber.getErrorValue()+", 行:"+ber.getRow()+", 列:"+ber.getColumn());
}
break;
case BlankRecord.sid: //形式が設定されたが、値がない
BlankRecord br = (BlankRecord)record;
print("空。 行:"+br.getRow()+", 列:"+br.getColumn());
break;
case FormulaRecord.sid: //数式
FormulaRecord fr = (FormulaRecord)record;
print(FormulaParser.toFormulaString(null, fr.getParsedExpression()));
break;
}
}
}
分享到:
相关推荐
而这里的重点是"poi3.6 event api",它指的是XSSFEventUserModel API,这是一种低内存占用的读取Excel文件的方法,特别适合处理大型工作簿。 XSSFEventUserModel API是基于事件驱动模型的,与传统的XSSFUserModel ...
标题 "POI3.8组件研究(七)--基于XSSF and SAX (Event API)事件的解析" 提到了Apache POI库的一个高级话题,主要关注的是如何使用XSSF(XML Spreadsheet Formatting Streams)和SAX(Simple API for XML)的Event ...
在本篇文章中,我们将深入探讨POI 3.5 API中的关键知识点,以及如何利用这些功能来优化你的Java应用。 1. **Excel处理** - **HSSF和XSSF**: POI 3.5支持两种类型的Excel文件,即旧版的.HSSF(Horrible Spreadsheet...
POI 3.5 API文档是该库的一个版本,提供了开发者在Java环境中读取、写入和操作这些文件的接口和类的详细说明。这个API文档包含了对类、方法、接口和异常的描述,帮助开发者理解如何有效地使用Apache POI。 在POI ...
- **Event-usermodel**:当处理较大的文件或者内存资源有限时,可以使用此 API。该模式只加载当前正在处理的数据行,因此可以有效地减少内存消耗。 #### 三、POI Excel 文档结构类 POI 的 HSSF 提供了丰富的类来...
- 使用POI的事件模型(EventModel API)进行低内存处理,仅在需要时读取和写入数据。 7. **文档兼容性**: - POI支持读取和写入不同版本的Office文件,但新版本的API通常提供更好的功能和性能。 总之,Apache ...
在本文中,我们将深入探讨Apache POI 3.8版本中的Event API,特别是针对HSSF(Horizontally Sparse File Format)的事件解析。Apache POI是一个流行的Java库,它允许开发人员处理Microsoft Office格式的文件,如...
标题"poi-3.9-20131203API"指的是这个版本是POI 3.9,在2013年12月3日发布,它提供了相关的API接口供开发者使用。描述中的"POI 3.9 API文档,poi 3.9的最新版本,最新合成的chm帮助文档"进一步证实了这是一个关于POI...
6. **高效率读取**:除了用户模型API,POI还提供了低级别处理,如Record和Event API,可以高效地读取文件的原始记录,适合进行深度分析或定制化操作。 7. **模板处理**:POI可以用于创建基于模板的文件生成,例如,...
POI支持创建和修改Excel中的图表,但功能相对有限,主要适用于简单的图表操作。 10. **事件模型(Event API)**: 对于处理大量数据或内存限制的情况,可以使用事件模型,如SXSSF,它只保留最近使用的行在内存中...
7. **事件模型**:对于大型Excel文件,可以使用事件模型(Event API)来降低内存消耗,仅处理必要的数据。 8. **工作簿工厂**:WorkbookFactory类可以用来根据文件自动选择合适的API(HSSF或XSSF)来创建Workbook...
- POI使用了事件模型(Event API)和用户模型(Usermodel API),两者各有优缺点,可以根据项目需求选择合适的使用。 6. **性能优化**: - 处理大量数据时,可以使用SXSSF避免内存溢出问题。 - 使用流式API可以...
标题中的"POI3.8以及3.9的API"指的是这两个版本的API接口文档,是开发者理解和使用POI库的关键资源。API文档详尽地列出了各种类、方法和接口,使得开发者能够有效地利用POI进行文件操作。 在POI 3.8和3.9中,主要...
5. **Event API**: 对于大型文件,POI提供了事件模型,允许开发者仅处理文件中的特定部分,而不是一次性加载整个文件,从而降低了内存消耗。 6. **SAX API**: 与Event API类似,SAX(Simple API for XML)模型用于...
- 对于只读操作,可以使用POI的事件模型(Event API),它只需要极小的内存就能处理大文件。 通过学习和使用Apache POI,开发者可以高效地在Java应用程序中处理Microsoft Office文件,提升办公自动化和数据处理的...
7. **流式读写**:通过SXSSF API,POI提供了对.xlsx文件的流式处理,这在处理大量数据时非常有用,因为它只保留最近使用的行在内存中。 8. **错误处理**:当读取文件时,POI会抛出异常来指示问题,例如文件格式错误...
- **性能优化**:对于大型文件,应当考虑使用SXSSF以减少内存消耗,或者使用流式处理(如POI的Event API)来处理大量数据。 - **错误处理**:正确处理可能出现的异常,如文件格式不正确、内存溢出等问题。 - **版本...
这个“POI导入导出合集”很可能包含了有关如何使用Apache POI库在Java程序中读取、创建和修改这些文件的示例代码或教程。 Apache POI 提供了一组API,使得开发者可以方便地在Java应用中操作Microsoft Office文档。...
7. **事件模型(Event API)**:对于大文件,可以使用事件模型,如SXSSF API,它基于拉模型,只在内存中保留最近使用的行,其余的写入磁盘,从而大大降低内存需求。 8. **版本更新**:Apache POI项目持续更新,修复...
2. **Event-usermodel API**:对于大型文件或需要高效处理的情况,可以使用这种 API,它通过事件驱动的方式处理数据,避免一次性加载整个文件到内存中。 #### 三、POI EXCEL 文档结构类 HSSF 提供了一系列类来表示 ...