Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to retrieve date from table cell using PhpSpreadsheet?

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

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

How to get the date from a cell in form of a UNIX time or a DateTimeInterface instance?

like image 389
Finesse Avatar asked Jun 01 '17 10:06

Finesse


3 Answers

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);
like image 171
Finesse Avatar answered Nov 17 '22 21:11

Finesse


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"
like image 23
Jay Avatar answered Nov 17 '22 23:11

Jay


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.

like image 10
Jemshid m h Avatar answered Nov 17 '22 21:11

Jemshid m h