如何使用PhpSpreadsheet从表格单元格中检索日期?

时间:2017-06-01 10:15:58

标签: php phpspreadsheet

我有xlsx个表,我使用PhpSpreadsheet来解析它们。一些单元格格式是日期。问题是PhpSpreadsheet以未指定的格式从日期格式的单元格返回值:

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

如何以UNIX时间或DateTimeInterface实例的形式从单元格中获取日期?

4 个答案:

答案 0 :(得分:18)

该值是自1900年以来经过的天数。您可以使用PhpSpreadsheet内置函数将其转换为unix时间戳:

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

或者是PHP DateTime对象:

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

答案 1 :(得分:2)

由于我无法添加评论,只能为将来的用户添加答案。您可以使用以下代码(从接受的答案中)将excel时间戳转换为unix时间戳

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

然后您可以使用\PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)函数确定给定的单元格是否为“日期时间”。

答案 2 :(得分:1)

我希望我的答案能为那些因阅读日期而迷失的人完成。对于包含日期的列,我也遇到了问题。 当我在Excel中阅读时,所有日期均为d / m / Y格式,但使用PhpOffice \ PhpSpreadsheet时,某些行读为d / m / Y,另一些行读为m / d / Y。 这是我的方法:

首先,我使用-> getDataType()检查格式

我的默认格式是m / d / Y,但是当-> getDataType()返回's'时,它将变成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']);

工作正常

答案 3 :(得分:0)

当我们使用$row->getCellIterator()进行迭代或可能具有其他类型的值时,改用getFormattedValue可能会有用

在使用getValue()

  • 全名:Jane Doe =>“ Jane Doe”
  • DOB:2000年11月18日=> 36848.0

在使用getFormattedValue()

  • 全名:Jane Doe =>“ Jane Doe”
  • DOB:2000年11月18日=>“ 11/18/2000”