`
weiqingfei
  • 浏览: 315519 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

POI中Event API的简单使用。

    博客分类:
  • Java
阅读更多
在使用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

    而这里的重点是"poi3.6 event api",它指的是XSSFEventUserModel API,这是一种低内存占用的读取Excel文件的方法,特别适合处理大型工作簿。 XSSFEventUserModel API是基于事件驱动模型的,与传统的XSSFUserModel ...

    POI3.8组件研究(四)--Event API (HSSF Only)事件的解析

    在本文中,我们将深入探讨Apache POI 3.8版本中的Event API,特别是针对HSSF(Horizontally Sparse File Format)的事件解析。Apache POI是一个流行的Java库,它允许开发人员处理Microsoft Office格式的文件,如...

    POI3.8组件研究(七)--基于XSSF and SAX (Event API)事件的解析

    标题 "POI3.8组件研究(七)--基于XSSF and SAX (Event API)事件的解析" 提到了Apache POI库的一个高级话题,主要关注的是如何使用XSSF(XML Spreadsheet Formatting Streams)和SAX(Simple API for XML)的Event ...

    poi最新3.5API

    在本篇文章中,我们将深入探讨POI 3.5 API中的关键知识点,以及如何利用这些功能来优化你的Java应用。 1. **Excel处理** - **HSSF和XSSF**: POI 3.5支持两种类型的Excel文件,即旧版的.HSSF(Horrible Spreadsheet...

    poi3.5API文档

    POI 3.5 API文档是该库的一个版本,提供了开发者在Java环境中读取、写入和操作这些文件的接口和类的详细说明。这个API文档包含了对类、方法、接口和异常的描述,帮助开发者理解如何有效地使用Apache POI。 在POI ...

    POI_中文API

    - **Event-usermodel**:当处理较大的文件或者内存资源有限时,可以使用此 API。该模式只加载当前正在处理的数据行,因此可以有效地减少内存消耗。 #### 三、POI Excel 文档结构类 POI 的 HSSF 提供了丰富的类来...

    POI_3.8_API

    - 使用POI的事件模型(EventModel API)进行低内存处理,仅在需要时读取和写入数据。 7. **文档兼容性**: - POI支持读取和写入不同版本的Office文件,但新版本的API通常提供更好的功能和性能。 总之,Apache ...

    poi-3.9-20131203API

    标题"poi-3.9-20131203API"指的是这个版本是POI 3.9,在2013年12月3日发布,它提供了相关的API接口供开发者使用。描述中的"POI 3.9 API文档,poi 3.9的最新版本,最新合成的chm帮助文档"进一步证实了这是一个关于POI...

    POI3.8和3.8的API

    6. **高效率读取**:除了用户模型API,POI还提供了低级别处理,如Record和Event API,可以高效地读取文件的原始记录,适合进行深度分析或定制化操作。 7. **模板处理**:POI可以用于创建基于模板的文件生成,例如,...

    JAVA操作Excel 的POI API文档(英文)

    POI支持创建和修改Excel中的图表,但功能相对有限,主要适用于简单的图表操作。 10. **事件模型(Event API)**: 对于处理大量数据或内存限制的情况,可以使用事件模型,如SXSSF,它只保留最近使用的行在内存中...

    poi3.7_jdk1.4 jar与poi3.7 api(chm)

    7. **事件模型**:对于大型Excel文件,可以使用事件模型(Event API)来降低内存消耗,仅处理必要的数据。 8. **工作簿工厂**:WorkbookFactory类可以用来根据文件自动选择合适的API(HSSF或XSSF)来创建Workbook...

    POI 3.10 包含API,源码和开发所需所有JAVA包

    - POI使用了事件模型(Event API)和用户模型(Usermodel API),两者各有优缺点,可以根据项目需求选择合适的使用。 6. **性能优化**: - 处理大量数据时,可以使用SXSSF避免内存溢出问题。 - 使用流式API可以...

    POI3.8以及3.9的API

    标题中的"POI3.8以及3.9的API"指的是这两个版本的API接口文档,是开发者理解和使用POI库的关键资源。API文档详尽地列出了各种类、方法和接口,使得开发者能够有效地利用POI进行文件操作。 在POI 3.8和3.9中,主要...

    poi-3.6开发包

    5. **Event API**: 对于大型文件,POI提供了事件模型,允许开发者仅处理文件中的特定部分,而不是一次性加载整个文件,从而降低了内存消耗。 6. **SAX API**: 与Event API类似,SAX(Simple API for XML)模型用于...

    对Apache POI的使用

    - 对于只读操作,可以使用POI的事件模型(Event API),它只需要极小的内存就能处理大文件。 通过学习和使用Apache POI,开发者可以高效地在Java应用程序中处理Microsoft Office文件,提升办公自动化和数据处理的...

    poi3.15jar包

    - **性能优化**:对于大型文件,应当考虑使用SXSSF以减少内存消耗,或者使用流式处理(如POI的Event API)来处理大量数据。 - **错误处理**:正确处理可能出现的异常,如文件格式不正确、内存溢出等问题。 - **版本...

    poi3.9读写excel兼容03和07版本

    7. **流式读写**:通过SXSSF API,POI提供了对.xlsx文件的流式处理,这在处理大量数据时非常有用,因为它只保留最近使用的行在内存中。 8. **错误处理**:当读取文件时,POI会抛出异常来指示问题,例如文件格式错误...

    POI导入导出合集

    这个“POI导入导出合集”很可能包含了有关如何使用Apache POI库在Java程序中读取、创建和修改这些文件的示例代码或教程。 Apache POI 提供了一组API,使得开发者可以方便地在Java应用中操作Microsoft Office文档。...

    poi打包分享

    7. **事件模型(Event API)**:对于大文件,可以使用事件模型,如SXSSF API,它基于拉模型,只在内存中保留最近使用的行,其余的写入磁盘,从而大大降低内存需求。 8. **版本更新**:Apache POI项目持续更新,修复...

    poi API大全

    2. **Event-usermodel API**:对于大型文件或需要高效处理的情况,可以使用这种 API,它通过事件驱动的方式处理数据,避免一次性加载整个文件到内存中。 #### 三、POI EXCEL 文档结构类 HSSF 提供了一系列类来表示 ...

Global site tag (gtag.js) - Google Analytics