【问题标题】:How to retrieve date from table cell using PhpSpreadsheet?如何使用 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 实例的形式从单元格中获取日期?

【问题讨论】:

    标签: php phpspreadsheet


    【解决方案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,这是一个单独问题的主题。如果您已经问过这个问题,请给我一个链接。
        猜你喜欢
        • 1970-01-01
        • 2019-02-03
        • 2018-08-15
        • 1970-01-01
        • 2019-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多