POI中Event API的简单使用。

在使用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;
}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值