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

How to retrieve date from table cell using PhpSpreadsheet?

我有 xlsx 个表,我使用 PhpSpreadsheet 来解析它们。一些单元格被格式化为日期。问题是 PhpSpreadsheet returns 来自未指定格式的日期格式单元格的值:

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

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

该值是自 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);

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

可能会有用

同时使用 getValue()

  • 全名:Jane Doe => "Jane Doe"
  • 出生日期:2000 年 11 月 18 日 => 36848.0

同时使用 getFormattedValue()

  • 全名:Jane Doe => "Jane Doe"
  • 出生日期:2000 年 11 月 18 日 =>“2000 年 11 月 18 日”

因为我不能添加评论只是为未来的用户添加一个答案。您可以使用以下代码(来自接受的答案)

将 excel 时间戳转换为 unix 时间戳
 $value = $worksheet->getCell('A1')->getValue();
 $date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp($value);

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

我希望我的回答对于那些迷失阅读日期的人来说是完整的。我对包含日期的列也有疑问。 当我读入 Excel 时,所有日期的格式都是 d/m/Y,但使用 PhpOffice\PhpSpreadsheet,一些行被读作 d/m/Y,其他行被读作 m/d/Y。 这是我的做法:

首先,我使用 ->getDataType()

检查格式

我的默认格式是 m/d/Y 但是当 ->getDataType() returns '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']);

效果很好