如何使用 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()
时
在使用getFormattedValue()
时
【讨论】:
确保将其设置为 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 从表格单元格中检索日期?的主要内容,如果未能解决你的问题,请参考以下文章