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は、日付のイタリア語のフォーマットです。どうすれば適切な日付オブジェクトに変換できますか?
おはようございます!
現在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]
コメントを追加