LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-12-17

前回の続きで今回も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メソッドでセルのタイプを取得できる。
具体的には以下の7つがある。
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
この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()

こんな感じです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0