JAVAの【POI】を使ってExcelのデータを読み込んで、特定文字がきたら置き換えるプログラムを作成し実行してみるとシステムエラーになるExcelとならないExcelに分かれました。
システムエラーになるExcelを実行してみてlogを見てみると
Cannot get a text value from a error formula cell
という文字が出てきました。
実行しているプログラムは以下の通り
int rowStart = sheet.getFirstRowNum();
int rowEnd = sheet.getLastRowNum();
int lastColNum = getLastColNum(sheet);
for (int i = rowStart; i <= rowEnd; i++) {
for (int j = 0; j <= lastColNum; j++) {
XSSFRow row = sheet.getRow(i);
if (row != null) {
XSSFCell cellserch = row.getCell(j);
if (cellserch != null) {
String value = cellserch.getRichStringCellValue().getString();
…以下処理
}
}
}
}
上記の記述の場合getRichStringCellValueはString型でしか値を取得しないので数値型や関数が入ってきたらエラーとなるようです。
エラーを回避にはgetCellTypeでどの型を取得しているかを判断を行うといいみたいです。
int rowStart = sheet.getFirstRowNum();
int rowEnd = sheet.getLastRowNum();
int lastColNum = getLastColNum(sheet);
for (int i = rowStart; i <= rowEnd; i++) {
for (int j = 0; j <= lastColNum; j++) {
XSSFRow row = sheet.getRow(i);
if (row != null) {
XSSFCell cellserch = row.getCell(j);
if (cellserch != null) {
if(cellserch.getCellType() == Cell.CELL_TYPE_STRING){
String value = cellserch.getRichStringCellValue().getString();
…以下処理
}
}
}
}
}
Cell.CELL_TYPE_STRINGがストリングかどうかを判断しています。中身は1が入っていました。
他にも
- Cell.CELL_TYPE_NUMERIC(=0)
- Cell.CELL_TYPE_STRING(=1)
- Cell.CELL_TYPE_FORMULA(=2)
- Cell.CELL_TYPE_BLANK(=3)
- Cell.CELL_TYPE_BOOLEAN(=4)
- Cell.CELL_TYPE_ERROR(=5)
があります。
getCellTypeでどの型を取り出しているのかを確認し、それに合わせた処理を行わないといけないですね。
また、getStringCellValueは非推奨(?)のようですのでgetRichStringCellValueを使用しております。