18

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

// 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实例的形式从单元格中获取日期?

4

4 回答 4

43

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

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

或者一个 PHPDateTime对象:

$value = $worksheet->getCell('A1')->getValue();
$date = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($value);
于 2017-06-01T10:15:58.007 回答
12

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

使用时getValue()

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

使用时getFormattedValue()

  • 全名:Jane Doe => "Jane Doe"
  • 出生日期:2000 年 11 月 18 日 => “2000 年 11 月 18 日”
于 2018-12-28T12:00:11.553 回答
8

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

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

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

于 2019-09-20T06:14:20.920 回答
3

我希望我的回答能为那些迷失阅读日期的人完成。我对包含日期的列也有疑问。当我在 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']);

它工作正常

于 2020-10-28T21:27:30.923 回答