POI3.8コンポーネント研究(四)
eventusermodelでファイルを読み込むeventusermodelでファイルを読み取るのはusermodelを使用するよりもずっと複雑ですが、アプリケーションがデータを読み取りながらデータを処理する必要があるため、効率も高くなります.eventusermodelは実際にDOM環境下でSAXがXMLドキュメントを処理する方法をシミュレートし、アプリケーションはまず所望の処理データを登録し、eventusermodelは一致するデータ構造に遭遇したときにアプリケーション登録をコールバックする方法である.eventusermodelを使用する最大の困難は、Excelワークブックの内部構造を熟知しなければならないことです.HSSFでは,低レベルのバイナリ構造をレコード(Record)と呼ぶ.記録には異なるタイプがあり、各タイプはorg.apache.poi.hssf.recordパッケージのJavaクラスの説明.たとえば、BOFRecordレコードはWorkbookまたはSheet領域の開始を示し、RowRecordは行が存在し、スタイル情報が保存されていることを示します.CellValueRecordInterfaceインタフェースを持つすべてのレコードは、NumericRecord、LabelSSTRecord、FormulaRecordなどのExcelのセルを表します(一部は廃棄され、一部は最適化処理に使用されますが、一般的にはHSSFは変換できます).
package com.easyway.excel.events;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
import org.apache.commons.collections.CollectionUtils;
import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder.SheetRecordCollectingListener;
import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.BoolErrRecord;
import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.record.FormulaRecord;
import org.apache.poi.hssf.record.LabelSSTRecord;
import org.apache.poi.hssf.record.NumberRecord;
import org.apache.poi.hssf.record.RowRecord;
import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
/**
* POI HSSF eventmodel
* : 。
* :1. 97~2003 excel, 2007 excel。
* 2. Excel Sheet 。
* @Title:
* @Description: TODO
* @Copyright:Copyright (c) 2011
* @Company:
* @Date:2012-6-14
* @author longgangbai
* @version 1.0
*/
public class UserModelEventListener implements HSSFListener {
private SSTRecord sstrec;
/** Should we output the formula, or the value it has? */
private boolean outputFormulaValues = true;
/** For parsing Formulas */
private SheetRecordCollectingListener workbookBuildingListener;
private int sheetNo=0;
private int curRowNum=0;
private int ignoreRowNum=1;
@Override
public void processRecord(org.apache.poi.hssf.record.Record record) {
switch (record.getSid()) {
case BOFRecord.sid:
BOFRecord bof = (BOFRecord) record;
// Workbook
if (bof.getType() == bof.TYPE_WORKBOOK) {
//System.out.println(" excel .....");
// Worksheet, Event API Excel ,
// sheet 。
} else if (bof.getType() == bof.TYPE_WORKSHEET) {
// Sheet
sheetNo++;
System.out.println(" Sheet :" +sheetNo);
}
break;
// Sheet , sheet, sheet , sheet , List
case BoundSheetRecord.sid:
BoundSheetRecord bsr = (BoundSheetRecord) record;
//System.out.println("New sheet named: " + bsr.getSheetname());
break;
//
case RowRecord.sid:
RowRecord rowrec = (RowRecord) record;
//System.out.println(" , first column at "
// + rowrec.getFirstCol() + " last column at "
// + rowrec.getLastCol());
break;
// SSTRecords store a array of unique strings used in Excel.
case SSTRecord.sid:
sstrec = (SSTRecord) record;
// for (int k = 0; k < sstrec.getNumUniqueStrings(); k++) {
// System.out.println("String table value " + k + " = "
// + sstrec.getString(k));
// }
break;
// cell, , , , , !!!!!!!
case NumberRecord.sid:
NumberRecord nr = (NumberRecord) record;
if(HSSFDateUtil.isInternalDateFormat(nr.getXFIndex())){
//System.out.println(" :"+
// +", :"+nr.getRow()+ ", :"+nr.getColumn()+"。("+nr.getXFIndex()+")");
String timeStr=(new SimpleDateFormat("yyyy-MM-dd")).format(HSSFDateUtil.getJavaDate(nr.getValue()));
addDataAndrChangeRow(nr.getRow(),nr.getColumn(),timeStr);
}else{
String timeStr=getTime(nr.getValue());;
// System.out.println(" :"+nr.getValue()+", :"+nr.getRow()+ ", :"+nr.getColumn()+"。("+nr.getXFIndex()+")");
addDataAndrChangeRow(nr.getRow(),nr.getColumn(),getTime(nr.getValue()));
}
break;
// , , index
case LabelSSTRecord.sid:
LabelSSTRecord lsr = (LabelSSTRecord)record;
addDataAndrChangeRow(lsr.getRow(),lsr.getColumn(), sstrec.getString(lsr.getSSTIndex()));
//System.out.println(" :"+sstrec.getString(lsr.getSSTIndex())+", :"+lsr.getRow()+", :"+lsr.getColumn());
break;
case BoolErrRecord.sid: // boolean
BoolErrRecord ber = (BoolErrRecord)record;
if(ber.isBoolean()){
addDataAndrChangeRow(ber.getRow(),ber.getColumn(), ber.getBooleanValue());
//System.out.println("Boolean:"+ber.getBooleanValue()+", :"+ber.getRow()+", :"+ber.getColumn());
}
if(ber.isError()){
//addDataAndrChangeRow(ber.getRow(),ber.getColumn(), ber.getErrorValue());
//System.out.println("Error:"+ber.getErrorValue()+", :"+ber.getRow()+", :"+ber.getColumn());
}
break;
//
case BlankRecord.sid:
BlankRecord br = (BlankRecord)record;
addDataAndrChangeRow(br.getRow(),br.getColumn(), "");
//System.out.println(" 。 :"+br.getRow()+", :"+br.getColumn());
break;
case FormulaRecord.sid: //
FormulaRecord fr = (FormulaRecord)record;
addDataAndrChangeRow(fr.getRow(),fr.getColumn(), fr.getValue());
//System.out.println(" 。 :"+fr.getRow()+", :"+fr.getColumn());
break;
}
}
/**
*
* @param row
* @param col
* @param value cell
*/
public void addDataAndrChangeRow(int row,int col,Object value){
// ,
if(curRowNum!=row){
System.out.print(row+":"+col+" "+value+"\r");
curRowNum=row;
}else{
System.out.print(row+":"+col+" "+value+"\r");
}
}
/**
* [ ]</li>
* @param sNum
* @return
*/
private static String getTime(double daynum)
{
double totalSeconds=daynum*86400.0D;
//
int seconds =(int)totalSeconds/60;
//
int hours =seconds/60;
int minutes = seconds-hours*60;
//
StringBuffer sb=new StringBuffer();
if(String.valueOf(hours).length()==1){
sb.append("0"+hours);
}else{
sb.append(hours);
}
sb.append(":");
if(String.valueOf(minutes).length()==1){
sb.append("0"+minutes);
}else{
sb.append(minutes);
}
return sb.toString();
}
/**
* Read an excel file and spit out what we find.
*
* @param args
* Expect one argument that is the file to read.
* @throws IOException
* When there is an error processing the file.
*/
public static void main(String[] args) throws IOException {
UserModelEventListener xlsEventListener=new UserModelEventListener();
MissingRecordAwareHSSFListener listener = new MissingRecordAwareHSSFListener(
xlsEventListener);
FormatTrackingHSSFListener formatListener = new FormatTrackingHSSFListener(listener);
// excel
FileInputStream fin = new FileInputStream("C:\\station2station.xls");
// org.apache.poi.poifs.filesystem.Filesystem
POIFSFileSystem poifs = new POIFSFileSystem(fin);
// excel 2003 POI
InputStream din = poifs.createDocumentInputStream("Workbook");
// Record , , addListener , Record
HSSFRequest req = new HSSFRequest();
//
req.addListenerForAllRecords(xlsEventListener);
boolean outputFormulaValues=true;
if (outputFormulaValues) {
req.addListenerForAllRecords(formatListener);
} else {
SheetRecordCollectingListener workbookBuildingListener = new SheetRecordCollectingListener(
formatListener);
req.addListenerForAllRecords(workbookBuildingListener);
}
//
HSSFEventFactory factory = new HSSFEventFactory();
//
factory.processEvents(req, din);
//
fin.close();
// POI
din.close();
System.out.println("done.");
}
}