前回の続きで今回もApachePOIの内容です。
※前回
https://qiita.com/Mk-4000/items/908266355307bcaf6993
セルの値の取得について
前回のセルの値の取得部分について別メソッドで記載していた部分についてです。
セルの値は単純にそのまま持ってこれるようではないようです。
前回のメソッドをそのまま抜粋。
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上で数字を文字列として扱っていた場合は数字もこっちに来る。(はず)
確認
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;
}
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()
こんな感じです。