2010-06-30 8 views
42

Ich benutze Apache POI 3.6, ich möchte eine Excel-Datei lesen, die ein Datum wie dieses hat 8/23/1991.Wie liest man eine Excel-Zelle mit Datum mit Apache POI?

switch (cell.getCellType()) { 

    ... 
    ... 

    case HSSFCell.CELL_TYPE_NUMERIC: 
    value = "NUMERIC value=" + cell.getNumericCellValue(); 
    break; 

    ... 

} 

Aber es nimmt den numerischen Wert ein und gibt den Wert wie diese 33473.0.

Ich habe versucht, Numeric Cell Type obwohl ohne Glück zu verwenden.

dbltemp=row.getCell(c, Row.CREATE_NULL_AS_BLANK).getNumericCellValue(); 

if (c == 6 || c == 9) { 
    strTemp= new String(dbltemp.toString().trim()); 

    long tempDate = Long.parseLong(strTemp); 
    Date date = new Date(tempDate); 

    strVal = date.toString(); 
} 

Wie kann ich mein Problem beheben?

Antwort

81

Wenn Sie wissen, welche Zelle, z. B. Spaltenposition, 0 in jeder Zeile ein Datum sein soll, können Sie direkt row.getCell(0).getDateCellValue() gehen.
http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFCell.html#getDateCellValue()

AKTUALISIERUNG: Hier ist ein Beispiel - Sie können dies in Ihrem Schalter Fall Code oben anwenden. Ich überprüfe und drucke sowohl den Zahlenwert als auch den Datumswert. In diesem Fall hat die erste Spalte in meinem Blatt Daten, daher verwende ich row.getCell (0).

Sie können den Codeblock if (HSSFDateUtil.isCellDateFormatted .. direkt in Ihrem Schaltergehäuse verwenden.

if (row.getCell(0).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) 
    System.out.println ("Row No.: " + row.getRowNum()+ " " + 
     row.getCell(0).getNumericCellValue()); 

    if (HSSFDateUtil.isCellDateFormatted(row.getCell(0))) { 
     System.out.println ("Row No.: " + row.getRowNum()+ " " + 
      row.getCell(0).getDateCellValue()); 
    } 
} 

Der Ausgang ist

Row No.: 0 39281.0 
Row No.: 0 Wed Jul 18 00:00:00 IST 2007 
Row No.: 1 39491.0 
Row No.: 1 Wed Feb 13 00:00:00 IST 2008 
Row No.: 2 39311.0 
Row No.: 2 Fri Aug 17 00:00:00 IST 2007 
+0

wechseln können, kann ich keine Werte erhalten ... Wenn Sie ein Code-Snippet angeben könnten, wäre das großartig ... – Venkat

+0

aktualisiert zu icnlude mein Code – JoseK

+7

Aufruf von DateUtil.isCellDateFormatted() wird einen Schritt voraus, um Ihren Code von HSSFs und XSSFs zu befreien. Durch die Verwendung von globalen Eltern anstelle von XLS/XLSX-abhängigen HSSF/XSSF-Kindern können Sie Ihren Code sehr universell gestalten. –

1

Sie benötigen die DateUtils: siehe this article für Details.

Oder, noch besser, verwenden Sie Andy Khans JExcel statt POI.

+0

ich fast viele Dinge in POI implementiert haben, ich bin so traurig, dass ich nicht für jede nur für diese gehen kann .. Es ist etwas sein muss .. Aber Danke duffymo – Venkat

+1

DateUtils Sie sortieren wird wenn Sie nicht zu JExcel – duffymo

5

Ja, habe ich verstanden, Ihr Problem. Wenn es schwierig ist, zu identifizieren, hat Zelle Numeric oder Data-Wert.

Wenn Sie Daten im Format haben möchten, das in Excel angezeigt wird, müssen Sie die Zelle nur mit der DataFormatter-Klasse formatieren.

DataFormatter dataFormatter = new DataFormatter(); 
String cellStringValue = dataFormatter.formatCellValue(row.getCell(0)); 
System.out.println ("Is shows data as show in Excel file" + cellStringValue); // Here it automcatically format data based on that cell format. 
// No need for extra efforts