JavaでExcelデータの取り込み2

前回の続きで今回もApachePOIの内容です。

※前回
https://qiita.com/Mk-4000/items/908266355307bcaf6993

#セルの値の取得について
前回のセルの値の取得部分について別メソッドで記載していた部分についてです。
セルの値は単純にそのまま持ってこれるようではないようです。
前回のメソッドをそのまま抜粋。

```SamplePOI.java
    private static String getCellStringValue(Cell cell) {
        String retStr;
        CellType cellType = cell.getCellType();
        switch (cellType) {
        case STRING:
            retStr = cell.getStringCellValue();
            break;
        case NUMERIC:
            retStr = String.valueOf(cell.getNumericCellValue());
            break;
        case BOOLEAN:
            retStr = String.valueOf(cell.getBooleanCellValue());
            break;
        case FORMULA:
            retStr = String.valueOf(cell.getCellFormula());
            break;
        case ERROR:
            retStr = String.valueOf(cell.getErrorCellValue());
            break;
        default:
            retStr = "";
            break;
        }
        return retStr;
    }
}
```

ここでは初めに取得対象のセルのタイプ（Javaで言う変数の型？状態？）を判断しています。
タイプによって取得に使うメソッドが変わってくるようです。

##セルタイプについて
getCellTypeメソッドでセルのタイプを取得できる。
具体的には以下の７つがある。
・**CellType._NONE**
不明セル。よくわからないけどめったに出てこないセルかと。

・**CellType.BLANK**
空白セル。

・**CellType.BOOLEAN**
ブーリアン。TRUEかFALSEや真偽を問うセル（「=A1=A2」のような）が対象。

・**CellType.ERROR**
エラー。多分計算ミスとは数式でエラーが出ているセル。
※「#N/A」や「#DIV/0!」などのセル

・**CellType.FORMULA**
数式。「=A1+B1」みたいに計算されて表示上は計算後の値で表示されるセル。
getCellFormulaメソッドで取得すると数式そのものが取得できるため、String変換するとそのまま「=A1+B1」が取得できます。

・**CellType.NUMERIC**
数値。数字が入っていたり、日付が入っているセル。

・**CellType.STRING**
文字列。対象セルの中身がテキストとなっているセル。
Excel上で数字を文字列として扱っていた場合は数字もこっちに来る。（はず）

###確認

```SamplePOI2.java

public class SamplePOI2 {

    /*
     * 本処理
     */
    public static void main(String[] args) {
        //ここに取り込みたいExcelファイルのフルパスを入れる
        String ExcelPath = "";

        //Excel用オブジェクト
        Workbook wb;
        Sheet sh;
        Row row;
        Cell cell;

        //取得データを保持するリスト
        List<String> columnA_List = new ArrayList<>();

        try (InputStream is = new FileInputStream(ExcelPath)) {

            //対象のExcelファイルをJavaに取り込み
            wb = WorkbookFactory.create(is);
            //対象ファイルの1枚目のシートを指定
            sh = wb.getSheetAt(0);
            //シート内の最大行を取得
            int rowMaxA = sh.getLastRowNum();

            //最大行分のループを回してA列のセルをString型として取得
            for (int i = 0; i <= rowMaxA; i++) {
                row = sh.getRow(i);
                if (row == null) {
                    continue;
                }
                cell = row.getCell(0);
                String cellValue = getCellTypes(cell);
                columnA_List.add(cellValue);
            }

            //コンソールに出力

            for (String outStr : columnA_List) {
                System.out.println(outStr);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
     * セルの状態を判別してString型で返す。
     */
    private static String checkCellType(Cell cell) {
        String retStr="";
        CellType cellType = cell.getCellType();
        switch (cellType) {
        case _NONE:
            retStr ="_NONE";
            break;
        case BLANK:
            retStr ="BLANK";
            break;
        case BOOLEAN:
            retStr ="BOOLEAN";
            break;
        case ERROR:
            retStr ="ERROR";
            break;
        case FORMULA:
            retStr ="FORMULA";
            break;
        case NUMERIC:
            retStr ="NUMERIC";
            break;
        case STRING:
            retStr ="STRING";
            break;
        }
        return retStr;
    }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494387/ee7099ba-76af-dc25-6ded-8e400b55b511.png)
このExcelを読み込ませた結果は

```cellType.result
BLANK
BOOLEAN
ERROR
FORMULA
NUMERIC
STRING
```

となりました。

##取得について
セルタイプがわかったらセルタイプごとの値の取得について。
###STRING
getStringCellValue()
もしくは
cell.getRichStringCellValue().getString()
で取得。違いはよくわからない。

###NUMERIC
int型にしたいなら
getNumericCellValue()
日にちなどDate型で取得したいなら
getDateCellValue()

###FORMULA
getCellFormula()
式がString型で取得できる

###ERROR
getErrorCellValue()
エラーコードとして取得する。(byte)

###BOOLEAN
boolean型でそのまま使えます。
getBooleanCellValue()

こんな感じです。