How to retrieve date from table cell using PhpSpreadsheet?

后端 未结 4 556
庸人自扰
庸人自扰 2020-12-06 06:14

I have xlsx tables and I use PhpSpreadsheet to parse them. Some cells format is date. The problem is that PhpSpreadsheet returns the values from date-formatted

相关标签:
4条回答
  • 2020-12-06 06:37

    The value is amount of days passed since 1900. You can use the PhpSpreadsheet built-in functions to convert it to a unix timestamp:

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

    Or to a PHP DateTime object:

    $value = $worksheet->getCell('A1')->getValue();
    $date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
    
    0 讨论(0)
  • 2020-12-06 06:42

    Since i cant add comment just adding an answer for future users. you can convert a excel timestamp to unix timestamp by using the following code (from accepted answer)

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

    And you can determine whether the given cell is Date Time using \PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell) function.

    0 讨论(0)
  • 2020-12-06 06:51

    I hope my answer will complete for those who are lost with reading date. I also had an issue with a column containing dates. When I read in Excel all dates were at the format d/m/Y, but using PhpOffice\PhpSpreadsheet, some lines were read as d/m/Y and others as m/d/Y. Here is how I do:

    First, I check the format with ->getDataType()

    my default format is m/d/Y but when ->getDataType() returns 's' it becomes 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']);
    

    it works fine

    0 讨论(0)
  • 2020-12-06 06:55

    When we are iterating with $row->getCellIterator() or we might have other kinds of value, it might be useful to use getFormattedValue instead

    while using getValue()

    • Full name: Jane Doe => "Jane Doe"
    • DOB: 11/18/2000 => 36848.0

    while using getFormattedValue()

    • Full name: Jane Doe => "Jane Doe"
    • DOB: 11/18/2000 => "11/18/2000"
    0 讨论(0)
提交回复
热议问题