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

Posted

技术标签:

【中文标题】如何使用 PhpSpreadsheet 从表格单元格中检索日期?【英文标题】:How to retrieve date from table cell using PhpSpreadsheet? 【发布时间】:2017-11-02 10:34:22 【问题描述】:

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

【问题讨论】:

【参考方案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']);

效果很好

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

在使用getValue()

全名:Jane Doe => “Jane Doe” 出生日期:11/18/2000 => 36848.0

在使用getFormattedValue()

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

【讨论】:

确保将其设置为 false $reader->setReadDataOnly(FALSE);否则 getformattedvalue() 函数不会做任何改变 谢谢@jeandavyNizigama 没有你的评论,回答是没有用的。【参考方案4】:

该值是自 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() 迭代单元格,您是否知道如何确定该单元格的值是否应该是日期(然后正确调用excelToTimestamp)?跨度> @AndreasWong,这是一个单独问题的主题。如果您已经问过这个问题,请给我一个链接。

以上是关于如何使用 PhpSpreadsheet 从表格单元格中检索日期?的主要内容,如果未能解决你的问题,请参考以下文章

详解PhpSpreadsheet设置单元格

如何在 PHPSpreadsheet 中更改单元格颜色

使用 PHPSpreadsheet 构建非常大的电子表格

是否可以使用 PhpSpreadSheet 在现有的电子表格中写入?

PhpSpreadsheet中文false

如何在 PhpSpreadsheet 中居中对齐单元格值?