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.");
	}

}