wake-up-neo.com

Wie liest man eine Excel-Zelle mit Date mit Apache POI?

Ich verwende Apache POI 3.6. Ich möchte eine Excel-Datei mit einem Datum wie diesem 8/23/1991 lesen.

 switch (cell.getCellType()) {

   ...
   ...

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

   ...

 }

Es nimmt jedoch den numerischen Werttyp und gibt den Wert wie folgt aus 33473.0 zurück.

Ich habe versucht, Numeric Cell Type zu verwenden, obwohl ich kein Glück hatte.

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? 

48
Venkat

Wenn Sie wissen, welche Zelle, d. H. Die Spaltenposition 0 in jeder Zeile ein Datum sein soll, können Sie direkt für row.getCell(0).getDateCellValue() gehen.
http://poi.Apache.org/apidocs/org/Apache/poi/hssf/usermodel/HSSFCell.html#getDateCellValue ()

UPDATE: Hier ist ein Beispiel - Sie können dies in Ihrem Switch-Case-Code oben anwenden. Ich überprüfe und drucke den Zahlenwert sowie den Datumswert. In diesem Fall enthält die erste Spalte in meinem Arbeitsblatt Datumsangaben, daher verwende ich row.getCell (0).

Sie können den Codeblock if (HSSFDateUtil.isCellDateFormatted .. direkt in Ihrem Schaltfall 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());
    }
}

Die Ausgabe 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
91
JoseK

Ja, ich habe Ihr Problem verstanden ... Wenn es schwierig ist, eine Zelle mit einem numerischen oder Datenwert zu identifizieren.

Wenn Sie Daten in einem 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 
8
Chintan

Sie benötigen das DateUtils: siehe diesen Artikel für Details.

Oder besser noch, verwenden Sie Andy Khans JExcel anstelle von POI.

1
duffymo

Sie können das Zellen-Datumsformat verwenden, um das Datum in demselben Format wie in einer Excel-Zelle abzurufen. Siehe den folgenden Code:

CellValue cv = formulaEv.evaluate(cell);
double dv = cv.getNumberValue();
if (HSSFDateUtil.isCellDateFormatted(cell)) {
    Date date = HSSFDateUtil.getJavaDate(dv);

    String df = cell.getCellStyle().getDataFormatString();

    strValue = new CellDateFormatter(df).format(date); 
}
0
Abhishek Mishra

Zum Lesen von Datumszellen hat sich diese Methode bisher als robust erwiesen:

private LocalDate readCellAsDate(final Row row, final int pos) {
    if (pos == -1) {
        return null;
    }
    final Cell cell = row.getCell(pos - 1);
    if (cell != null) {
        cell.setCellType(CellType.NUMERIC);
    } else {
        return null;
    }
    if (DateUtil.isCellDateFormatted(cell)) {
        try {
            return cell.getDateCellValue().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        } catch (final NullPointerException e) {
            logger.error(e.getMessage());
            return null;
        }
    }
    return null;
}
0
yglodt

Wenn Sie die Zellennummer kennen, würde ich die Verwendung der Methode getDateCellValue () empfehlen. Hier ist ein Beispiel für dasselbe, das für mich funktioniert hat - Java.util.Date date = row.getCell (). GetDateCellValue (); System.out.println (Datum);

0
user1416932