/********************************************************************************************/
/* クラス/インタ?フェ?ス名       :KAZEExcelParsingENGINE                                 */
/* ファイル名                       :KAZEExcelParsingENGINE.java                            */
/* バ?ジョン情報                   :1.00.0                                                 */
/* 更新履?       :日付            ?更者             案件ID            リリ?ス日          */
/*                :2007.05.28      Kim.JH             <%AID%>(新規)                         */
/*                                                                                          */
/********************************************************************************************/
package exceltest.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import exceltest.bean.KAZEDataObject;
import exceltest.bean.KAZEExcelObject;
import exceltest.bean.KAZESheetObject;
import exceltest.bean.KAZEUnitObject;
import exceltest.util.KAZEExcelException;
import exceltest.util.KAZEExcelUtil;

/**
* <pre>
* クラス名?               :KAZEExcelParsingENGINE.
* </pre>
* @version 1.00.0
* @author  Kim.JH
* @since   1.00.0
*/
public class KAZEExcelParsingENGINE {

    /** ワ?クブック */
    private HSSFWorkbook wb;
    /** ワ?クシ?ト */
    private HSSFSheet sheet;
    /** UnitObject */
    private KAZEUnitObject unitObject;
    /** DataObject */
    private KAZEDataObject dataObject;
    /** SheetObject */
    private KAZESheetObject sheetObject;
    /** ExcelObject */
    private KAZEExcelObject excelObject;
    /** 現在のロウ番? */
    private int nowRowNumber;
    /** 現在のセル番? */
    private short nowCellNumber;
    /** 識別者名? */
    private ArrayList defineName;
    /** シ?ト名? */
    private String sheetName;
    
    /**
    * 基本生成者
    * @param file Excelファイル
    */
    public KAZEExcelParsingENGINE(File file) {
        openExcelFile(file);
    }
    
    /**
    * <pre>
    *  ExcelObjectの返却
    * </pre>
    * @return ExcelObject
    */
    public KAZEExcelObject getExcelObject() {
        return excelObject;
    }
    
    /**
    * <pre>
    *  渡されたExcelファイルを?み取ります。
    * </pre>
    * @param file
    */
    private void openExcelFile(File file) {
        // ExcelObjectのインスタンスを生成
        excelObject = new KAZEExcelObject();
        
        try {
            // 渡されたExcelファイルからワ?クブックの生成繰返す
            wb = new HSSFWorkbook(new FileInputStream(file));
            // シ?ツの?ぐらい繰り返してSheetObjectを生成
            for (int scnt = 0; scnt < wb.getNumberOfSheets(); scnt++) {
                sheetName = wb.getSheetName(scnt);
                readExcelSheet();
                // シ?トの判?(LocalData:テストケ?スがあるシ?ト CommonData:共通デ?タ)
                if (sheetObject.getTestCase() != null) {
                    excelObject.putLocalData(sheetName, sheetObject);
                } else {
                    Iterator it = defineName.iterator();
                    for (int dcnt = 0; dcnt < defineName.size(); dcnt++) {
                        excelObject.putCommonData((String) it.next(), sheetObject
                        .getData((String) defineName.get(dcnt)));
                    }
                }
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(“指定されたファイルが存在しません。ファイルは” + file.getName() + “です。”);
        } catch (IOException e) {
            throw new RuntimeException(“ファイルの?み取りの間にエラ?が?生しました。ファイルは” + file.getName() + “です。”);
        }
    }
    
    /**
    * <pre>
    *  ExcelSheetを?み取ります。
    * </pre>
    */
    private void readExcelSheet() {  
        sheetObject = new KAZESheetObject();
        sheet = wb.getSheet(sheetName);
        // リストに現在の定義名?を格納する。
        defineName = new ArrayList();
        // 現在のロウ番?を初期化
        nowRowNumber = 0;
        // シ?ト?のロウ?ぐらい?みながら情報取得
        while (nowRowNumber <= sheet.getLastRowNum()) {
            HSSFRow rows = sheet.getRow(nowRowNumber);
            if (rows != null) {
                // ロウの一番のセルだけ??む
                nowCellNumber = 0;
                // Utilからセルのタイプを取得して?理の判?と制御
                switch (KAZEExcelUtil.getCellType(rows.getCell(nowCellNumber))) {
                    // セルのタイプがテストケ?スの場合
                    case KAZEIDConst.CELL_TYPE_TESTCASE:
                        // テストケ?スの作成とセット
                        makeTestCase();      
                        sheetObject.setTestCase(dataObject);
                        break;
                        // セルのタイプがテストケ?ス以外で’#’というDefine名?で定義された場合
                    case KAZEIDConst.CELL_TYPE_DEFINE:
                        // セルからDefine名?を取得
                        String define = rows.getCell(nowCellNumber).getRichStringCellValue().toString();
                        defineName.add(define.substring(1));
                        // InputDataの作成とセット
                        makeInputData();
                        sheetObject.putData(define.substring(1), dataObject);
                        break;
                        // 上の?件以外でコメントとシングルコメントと空白と未定義されたセルの場合は無視
                    case KAZEIDConst.CELL_TYPE_COMMENT:
                    case KAZEIDConst.CELL_TYPE_DOLLAR:
                    case KAZEIDConst.CELL_TYPE_NOCELL:
                    case KAZEIDConst.CELL_TYPE_BLANK:
                        break;
                    // 上の?件以外の場合は全部エラ?
                    default:
                        throw new KAZEExcelException(“シ?トの定義が正しくないです。”, sheetName, nowRowNumber, nowCellNumber);
                }
            }
            nowRowNumber++;
        }
    }
    
    /**
    * <pre>
    *  現在のロウを取得する。
    * </pre>
    * @return
    */
    private HSSFRow getCheckedRow() {  
        HSSFRow row = sheet.getRow(nowRowNumber);
        // ロウの?態をチェック
        if (row == null) {
            // Nullの場合はエラ??生
            throw new KAZEExcelException(“指定されたロウが正しくないです。”, sheetName, nowRowNumber);
        }
        return row;
    }
        
    /**
    * <pre>
    * テストケ?ス作成する。
    * </pre>
    */
    private void makeTestCase() {  
        while (++nowRowNumber <= sheet.getLastRowNum()) {
            nowCellNumber = 0;
            HSSFCell cell = getCheckedRow().getCell(nowCellNumber);
            int cellType = KAZEExcelUtil.getCellType(cell);
            // Utilからセルのタイプを取得して?理の制御
            if (cellType == KAZEIDConst.CELL_TYPE_STRING) {
                String cellValue = cell.getRichStringCellValue().toString();
                // 取得したセルの中身が”INPUTDATA”の場合は?理の省略:約束された?語
                if (cellValue.equals(KAZEIDConst.INPUTDATA)) {
                    // 取得したセルの中身が”NO”の場合は次の?理を進行:約束された?語
                } else if (cellValue.equals(KAZEIDConst.NO)) {
                    break;
                } else {
                    // 上の?件以外のセルのタイプがStringの場合はすべてエラ?
                    throw new KAZEExcelException(“セルの定義が正しくないです。”, sheetName, nowRowNumber, nowCellNumber);
                }
                // シングルコメントとコメントの場合は無視
            } else if (cellType == KAZEIDConst.CELL_TYPE_COMMENT || cellType == KAZEIDConst.CELL_TYPE_DOLLAR) {    
            } else {
                throw new KAZEExcelException(“ロウの定義が正しくないです。”, sheetName, nowRowNumber);
            }
        }
        // dataObjectを生成してキ?ValueとDataValueをセッティング
        dataObject = new KAZEDataObject();
        makeKeyList();
        makeDataList();
    }
    
    /**
    * <pre>
    *  InputDataの作成する。
    * </pre>
    */
    private void makeInputData() {
        String class_path = null;
        while (++nowRowNumber <= sheet.getLastRowNum()) {
            nowCellNumber = 0;
            HSSFCell cell = getCheckedRow().getCell(nowCellNumber);
            // 取得したセルのタイプがクラスの場合はDataObjectのClassPathをセット
            if (KAZEExcelUtil.getCellType(cell) == KAZEIDConst.CELL_TYPE_CLASS) {
                String cellValue = cell.getRichStringCellValue().toString();
                class_path = cellValue.substring(cellValue.indexOf(“=”) + 1, cellValue.length());
                nowRowNumber++;
                break;
            // 上記以外の場合の中でシングルコメントとコメントの場合は無視
            } else if (KAZEExcelUtil.getCellType(cell) == KAZEIDConst.CELL_TYPE_COMMENT
                 || KAZEExcelUtil.getCellType(cell) == KAZEIDConst.CELL_TYPE_DOLLAR) {
            // 上記以外の場合は全部エラ?
            } else {
                throw new KAZEExcelException(“ロウの定義が正しくないです。”, sheetName, nowRowNumber);
            }
        }
        dataObject = new KAZEDataObject(class_path);
        makeKeyList();
        makeDataList();
    }
    
    /**
    * <pre>
    *  keyList(Column名?)を作成する。
    * </pre>
    */
    private void makeKeyList() {
        HSSFRow row = getCheckedRow();
        // Key値に?該するListを作成
        for (nowCellNumber = 0; nowCellNumber < row.getPhysicalNumberOfCells(); nowCellNumber++) {
        HSSFCell cell = row.getCell(nowCellNumber);
        // 取得したセルのタイプを判?
            switch (KAZEExcelUtil.getCellType(cell)) {
                // コメントの場合はコメントの位置で?理の判?
                case KAZEIDConst.CELL_TYPE_COMMENT:
                    // コメントの位置が一番前の場合一行目全部無視
                    if (nowCellNumber == 0)
                         nowCellNumber = (short) row.getPhysicalNumberOfCells();
                         
                     // 上記以外の場合は現在の位置から無視(?理無し)
                    while (nowCellNumber < row.getPhysicalNumberOfCells()) {
                        nowCellNumber++;
                    }
                    break;
                // シングルコメントの場合?該されるセルだけ無視
                case KAZEIDConst.CELL_TYPE_DOLLAR:
                    unitObject = KAZEExcelUtil.getKeyUnitObject(KAZEIDConst.CELL_TYPE_DOLLAR, cell
                        .getRichStringCellValue().toString(), sheetName, nowRowNumber, nowCellNumber);
                    dataObject.addKeyList(unitObject);
                    break;
                // ストリングの場合Utilからセルの値(UnitObject)を取得
                case KAZEIDConst.CELL_TYPE_STRING:
                    unitObject = KAZEExcelUtil.getKeyUnitObject(KAZEIDConst.CELL_TYPE_STRING, cell
                    .getRichStringCellValue().toString(), sheetName, nowRowNumber, nowCellNumber);
                    dataObject.addKeyList(unitObject);
                    break;
                // 上記以外の場合は全部エラ?
                default:
                    throw new KAZEExcelException(“セルの値が正しくないです。”, sheetName, nowRowNumber, nowCellNumber);
            }
        }
    }
    
    /**
    * <pre>
    * DataList(テストの?象)を作成する。
    * </pre>
    */
    private void makeDataList() {
        
        while (++nowRowNumber <= sheet.getLastRowNum()) {
            HSSFRow row = getCheckedRow();
            HashMap dataMap = new HashMap();   
            for (nowCellNumber = 0; nowCellNumber < dataObject.getKeySize(); nowCellNumber++) {
                HSSFCell cell = row.getCell(nowCellNumber);
                // Utilからセルのタイプを取得して?理の判?
                switch (KAZEExcelUtil.getCellType(cell)) {
                    // Blankの場合は空白をセッティング
                    case KAZEIDConst.CELL_TYPE_BLANK:
                        unitObject = KAZEExcelUtil.getDataUnit(dataObject.getKey(nowCellNumber).getType(), cell
                            .getRichStringCellValue().toString(), sheetName, nowRowNumber, nowCellNumber);
                        dataMap.put(dataObject.getKey(nowCellNumber).getData(), unitObject);
                        break;
                    // 以下の?理はmakeKeyListと同じ
                    case KAZEIDConst.CELL_TYPE_STRING:
                        unitObject = KAZEExcelUtil.getDataUnit(dataObject.getKey(nowCellNumber).getType(), cell
                                .getRichStringCellValue().toString(), sheetName, nowRowNumber, nowCellNumber);
                        dataMap.put(dataObject.getKey(nowCellNumber).getData(), unitObject);
                        break;
                    case KAZEIDConst.CELL_TYPE_COMMENT:
                        if (nowCellNumber == 0)
                            nowCellNumber = (short) row.getPhysicalNumberOfCells();
                        while (nowCellNumber < row.getPhysicalNumberOfCells()) {
                            unitObject = KAZEExcelUtil.getDataUnit(KAZEIDConst.UNITOBJECT_TYPE_BASE, KAZEIDConst.BLANK,
                            sheetName, nowRowNumber, nowCellNumber);
                            dataMap.put(dataObject.getKey(nowCellNumber).getData(), unitObject);
                            nowCellNumber++;
                        }
                        break;
                    case KAZEIDConst.CELL_TYPE_DOLLAR:
                        unitObject = KAZEExcelUtil.getDataUnit(KAZEIDConst.UNITOBJECT_TYPE_DOLLAR, cell
                        .getRichStringCellValue().toString(), sheetName, nowRowNumber, nowCellNumber);
                        dataMap.put(dataObject.getKey(nowCellNumber).getData(), unitObject);
                        break;
                        // セルのタイプがEndまで?行
                    case KAZEIDConst.CELL_TYPE_END:
                        return;
                    default:
                        throw new KAZEExcelException(“セルの値が正しくないです。”, sheetName, nowRowNumber, nowCellNumber);
                }
            }
            
            if (dataMap.size() != 0) {
                dataObject.addDataList(dataMap);
            }
        
        }
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *