如何使用 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']);
效果很好
我有 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']);
效果很好