1

Apache POI を使用して古い (2007 年より前および XLS) Excel ファイルを読み込もうとしています。私のプログラムは行の最後に行き、null または空ではないものが見つかるまで繰り返します。次に、数回繰り返してそれらのセルを取得します。このプログラムは、Office 2010 で作成された XLSX および XLS ファイルを正常に読み取ることができます。

次のエラー メッセージが表示されます。

Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
    at java.lang.Double.parseDouble(Unknown Source)

行で:

num = Double.parseDouble(str);

コードから:

str = cell.toString();

if (str != "" || str != null) {
    System.out.println("Cell is a string");
    num = Double.parseDouble(str);
} else {
    System.out.println("Cell is numeric.");
    num = cell.getNumericCellValue();
}

cell、ドキュメント内の空でも null でもない最後のセルです。空でもnullでもない最初のセルを印刷しようとすると、何も印刷されないため、正しくアクセスしていないと思います。

4

3 に答える 3

3

おそらく、空白のセルを読み取っている理由は、Excelファイルを読み取るためにApachePOIの適切なサブコンポーネントを使用しているためです。XLS形式にはHSSF(Horrible SpreadSheet Format)を使用し、XLSX形式にはXSSF(XML SpreadSheet Format)を使用します。


コード自体に関しては、ブール式を改良することをお勧めします。||or演算子( )を使用しているので、現在の方法では、

  • ifステートメントの最初の部分はif str != null、および
  • ifステートメントのelse一部はifで実行されますstr == null

ifステートメントの最初の部分は、数値として解析できない場合NumberFormatExceptionに呼び出しをスローします。Double.parseDoublestr

次のコードスニペットが役立つかもしれません。

if (str == null || str.trim().isEmpty()) {
    // handle null and empty strings
} else if (cell.getType() == Cell.CELL_TYPE_NUMERIC) {
    System.out.println("Cell is numeric.");
    num = cell.getNumericCellValue();
} else {
    // If the cell is not numeric, Double.parseDouble(str) 
    // will most likely throw a NumberFormatException
}

詳細についてCellは、Javadocを参照してください。

于 2012-06-01T21:12:49.367 に答える
2

細胞の種類を評価してから、必要なことを行う方がよいでしょう。このコードを使用してセル データを処理します (空白のセルも処理していることを確認してください)。

switch (cell.getCellType()) {
    case Cell.CELL_TYPE_STRING:
        str = cell.toString().trim();
        break;
    case Cell.CELL_TYPE_NUMERIC:
        if (DateUtil.isCellDateFormatted(cell)) {
            //you should change this to your application date format
            objSimpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
            str = objSimpleDateFormat.format(cell.getDateCellValue());
        } else {
            num = cell.getNumericCellValue();
            str = String.valueOf(cell.getNumericCellValue());
        }
        break;
    case Cell.CELL_TYPE_BLANK:
        str = "";
        break;
    case Cell.CELL_TYPE_ERROR:
        str = "";
        break;
    case Cell.CELL_TYPE_BOOLEAN:
        str = String.valueOf(cell.getBooleanCellValue());
    break;
}
于 2012-06-01T21:41:27.247 に答える
0

どのコード行番号で例外が発生したかを全員が知っているとよいでしょう。

コードの最初の行が原因だと思います。オブジェクト セルは null になる可能性があり、null アドレスは String 型に変換できません。コードで確認できます。

注: コードが Office 2010 で動作するのは良いことですが、この種の問題はどのバージョンの Excel でも発生する可能性があると思います。

于 2012-06-01T21:17:58.980 に答える