この「奇妙な」セル値を取得して日付オブジェクトに正しく変換するには、Apache POIを使用してExcelを解析する方法を教えてください。

AndreaNobili:

Apache POI使用してJavaからExcelを解析しようとすることに夢中になり、日付を含む特定の列を解析する次の問題を見つけました。

これは私のExcelファイルの列です:

ここに画像の説明を入力してください

ご覧のとおり、この列には日付フィールドが含まれていますが、この列の一部のセルには数値が含まれています。他のいくつかのセルにテキストが含まれてます(Excel関数TYPE()を使用して確認できます)。すべてのセルに日付フィールドが含まれているため、それがどのように可能であるかは本当にわかりません。アイデアは?

とにかく私のコードでは、この奇妙な状況をこのように処理しようとしています:

if(currentRow.getCell(20) != null && !currentRow.getCell(20).toString().trim().isEmpty()) {
    
    if(currentRow.getCell(20).getCellType().toString().equals("STRING")) {
        System.out.println("Data sottoscrizione contratto è STRING: " + currentRow.getCell(20).toString());
        
    }
    else if(currentRow.getCell(20).getCellType().toString().equals("NUMERIC")) {
        System.out.println("Data sottoscrizione contratto è NUMERIC");
        String dateAsString = currentRow.getCell(20).toString();
        System.out.println("DATA SOTTOSCRIZIONE CONTRATTO: " + currentRow.getCell(20).toString());
        
        
    }
}

このようにして、日付に変換しようとする両方のケースを処理できます。

そして、ここで私の問題。if NUMERICケースに入るときにExcelの数値が見つかった場合

そしてセル値を次のように出力します

System.out.println("DATA SOTTOSCRIZIONE CONTRATTO: " + currentRow.getCell(20).toString());

日付値16/10/2017に関連する16- ott -2017を印刷して入手します

そして、ここでいくつかの疑問:なぜ私が代わりにこの形式でのようなものを得るのです16/10/2017を

16-ott-2017は、日付のイタリア語のフォーマットです。どうすれば適切な日付オブジェクトに変換できますか?

deHaar:

おはようございます!

現在toString()、セルメソッドを使用しています。これは、数値や日付を返す場合にはあまり正確ではありません。時々動作するかもしれませんが、常に動作するとは限りません。

以下のように、あなたの本当の価値を得る方法を使用してCell.getNumericCellValue()Cell.getDateCellValue()(それが返すので古いjava.util.Date)またはCell.getLocalDateTimeCellValue()セルにのようなテキストのみが含まれる場合は"16-ott-2020"、を使用してgetStringCellValue()、返される値をaに変換しますLocalDate(またはLocalDateTime時刻が重要かどうによって異なります)。

これは(へのLocalDate変換の例です

public static void main(String[] args) {
    // assuming you alread received the value as String
    String cellStringValue = "16-ott-2020";
    // provice a formatter that can parse Italian month names (or days of week)
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MMM-uuuu", Locale.ITALIAN);
    // parse the String to a LocalDate
    LocalDate sediciOttobreDuemilaEVenti = LocalDate.parse(cellStringValue, dtf);
    // and print its default value
    System.out.println(sediciOttobreDuemilaEVenti);
    // alternatively use the same formatter for output
    System.out.println(sediciOttobreDuemilaEVenti.format(dtf));
}

そのコードの出力は

2020-10-16
16-ott-2020

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ