Apache POIを使用してExcel形式データからセルの値を取得するときは、セル種別を判断して適切な取得処理メソッドを使用するのが基本的な方法になります。
この方法ではセルの値を取得して文字列に変換すると、次のように指定した値と違う情報になることがあります。
指定値 | セル種別 | 取得型 | 文字列表示例 |
---|---|---|---|
123 | 数値 | double型が取得できます。 | 123.0 |
9月1日 | 数値(日付) | Date型が取得できます。 | Tue Sep 01 00:00:00 GMT+09:00 2020 |
- セル種別:数値
- 取得できる型がdouble型になります。整数を指定しても、文字列として表示すると小数点が表示されます。
- セル種別:数値(日付)
- 取得できる型がDate型になります。文字列として表示するとDate型の文字列として表示されくます。
このため、セルに指定されている情報を文字列として使用する場合は、取得後に種別ごとのフォーマット処理が必要になります。
今回は、セル種別の判断、種別ごとのフォーマット処理を使用しないで、セルに指定されている値を文字列として取得する方法を紹介していきます。
検証環境
検証に使用した環境/ライブラリを次に記載します。
- Java
- バージョン:11
- Apache POI
- バージョン:4.1.2
ビルドスクリプト
検証に使用するGradleビルドスクリプトです。
plugins {
id 'java'
}
sourceCompatibility = '11'
repositories {
jcenter()
}
dependencies {
// apache-poi
implementation 'org.apache.poi:poi:4.1.2'
implementation 'org.apache.poi:poi-ooxml:4.1.2'
}
poi-ooxmlは、Office Open XML(xlsxファイルの形式)を読み取るために必要なライブラリになります。対象としない場合は、不要なライブラリになります。
セルから値を取得する
セルから文字列を取得すためにorg.apache.poi.ss.usermodel.DataFormatterを使用します。このクラスを使用することで、セルに指定されている文字列を取得することができます。
使用方法はorg.apache.poi.ss.usermodel.DataFormatterのインスタンスを作成して、formatCellValueメソッドに取得したセルを指定することで文字列を取得することができます。
サンプルプログラム
package com.fumidzuki.example.apache.poi;
import java.io.FileInputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class ExampleApachePoiService {
public void read(final String fileName) {
DataFormatter formatter = new DataFormatter();
try (FileInputStream is = new FileInputStream(fileName)) {
Workbook book = WorkbookFactory.create(is);
Sheet sheet = book.getSheetAt(0);
for (int i = 0; i <= sheet.getLastRowNum(); i++) {
Row row = sheet.getRow(i);
Cell cell = row.getCell(0);
// セルを指定して文字列を取得します。
System.out.println(formatter.formatCellValue(cell));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
取得例
検証するときに使用したデータ形式と取得例は、次のようになりあます。
表示値 | 数式バー値 | 取得文字列 |
---|---|---|
123 | 123 | 123 |
サンプルテキスト | サンプルテキスト | サンプルテキスト |
TRUE | TRUE | TRUE |
FALSE | FALSE | FALSE |
9月1日 | 2020/09/01 | 9月1日 |
10240 | =10*1024 | 10*1024 |
#DIV/0! | =1/0 | 1/0 |
日付は、セルに指定している書式設定のフォーマットで文字列が取得できます。
補足情報
セル種別を判断しないで文字列を取得する方法として、次の方法が紹介されていることがあります。
cell.setCellType(org.apache.poi.ss.usermodel.CellType.STRING);
この方法でも文字列を取得することはできます。
ただし、この方法は非推奨になっています。また、バージョン5.0では削除予定のため注意してください。
まとめ
セルから値を取得するときに、セル種別を判断しないで文字列を取得する方法を紹介しました。
参考情報
Cell.setCellTypeのJavadocは、次を参考にしてください。