Wie rufe ich mit PhpSpreadsheet das Datum aus einer Tabellenzelle ab?

Lesezeit: 2 Minuten

Benutzer-Avatar
Finesse

Ich habe xlsx Tabellen und ich verwende PhpSpreadsheet, um sie zu analysieren. Einige Zellen sind als Datum formatiert. Das Problem besteht darin, dass PhpSpreadsheet die Werte von Zellen im Datumsformat in einem nicht spezifizierten Format zurückgibt:

// What it looks in excel: 2017.04.08 0:00
$value = $worksheet->getCell('A1')->getValue();  // 42833 - doesn't look like a UNIX time

So erhalten Sie das Datum aus einer Zelle in Form einer UNIX-Zeit oder einer DateTimeInterface Beispiel?

Der Wert ist die Anzahl der Tage, die seit 1900 vergangen sind. Sie können die integrierten Funktionen von PhpSpreadsheet verwenden, um ihn in einen Unix-Zeitstempel umzuwandeln:

$value = $worksheet->getCell('A1')->getValue();
$date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp($value);

Oder zu einem PHP DateTime Objekt:

$value = $worksheet->getCell('A1')->getValue();
$date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);

  • Wenn ich die Zellen über iteriere $row->getCellIterator()wissen Sie zufällig, wie Sie feststellen können, ob der Wert dieser Zelle ein Datum sein soll (und dann korrekt aufruft excelToTimestamp)?

    – Andreas Wang

    2. Juli 2018 um 13:25 Uhr

  • @AndreasWong, es ist ein Thema für eine separate Frage. Wenn Sie die Frage bereits gestellt haben, geben Sie mir einen Link.

    – Finesse

    3. Juli 2018 um 7:11 Uhr

Wenn wir mit iterieren $row->getCellIterator() oder wir könnten andere Arten von Werten haben, die nützlich sein könnten getFormattedValue stattdessen

während dem Benutzen getValue()

  • Vollständiger Name: Jane Doe => “Jane Doe”
  • Geburtsdatum: 18.11.2000 => 36848.0

während dem Benutzen getFormattedValue()

  • Vollständiger Name: Jane Doe => “Jane Doe”
  • Geburtsdatum: 18.11.2000 => “18.11.2000”

  • Stellen Sie sicher, dass Sie es auf false setzen $reader->setReadDataOnly(FALSE); andernfalls wird die Funktion getformattedvalue() keine Änderung vornehmen

    – Jean Davy Nizigama

    6. August 2020 um 11:28 Uhr

  • danke @jeandavyNizigama Ohne Ihren Kommentar ist die Antwort nutzlos.

    – iniravpatel

    13. Mai 2021 um 8:00 Uhr

Da ich keinen Kommentar hinzufügen kann, füge ich nur eine Antwort für zukünftige Benutzer hinzu. Sie können einen Excel-Zeitstempel in einen Unix-Zeitstempel konvertieren, indem Sie den folgenden Code verwenden (aus der akzeptierten Antwort).

 $value = $worksheet->getCell('A1')->getValue();
 $date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp($value);

Und Sie können bestimmen, ob die angegebene Zelle Date Time ist, indem Sie verwenden \PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell) Funktion.

Ich hoffe, meine Antwort wird für diejenigen vervollständigt, die mit dem Lesedatum verloren sind. Ich hatte auch ein Problem mit einer Spalte mit Datumsangaben. Als ich in Excel las, hatten alle Daten das Format d/m/Y, aber mit PhpOffice\PhpSpreadsheet wurden einige Zeilen als d/m/Y und andere als m/d/Y gelesen. So mache ich es:

Zuerst überprüfe ich das Format mit ->getDataType()

Mein Standardformat ist m/d/Y, aber wenn ->getDataType() ‘s’ zurückgibt, wird es zu d/m/Y

$cellDataType = $objSheetData->getCell("D".$i)->getDataType();
$cellFormat="m/d/Y";
if ($cellDataType=='s'){
    $cellFormat="d/m/Y";
}
$resultDate=\DateTime::createFromFormat($cellFormat, $sheetData[$i]['D']);

es funktioniert gut

1014920cookie-checkWie rufe ich mit PhpSpreadsheet das Datum aus einer Tabellenzelle ab?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy