【问题标题】:How to read a date with ExcelBundle [Symfony Bundle]如何使用 ExcelBundle [Symfony Bundle] 读取日期
【发布时间】:2015-03-26 14:13:23
【问题描述】:

我在尝试使用 DateTime 单元格的 $cell->getCalculatedValue() 读取单元格值时遇到问题。

excel 文件值为 28/2/15(格式为 d/m/y),但我得到的是 42063

这是格式的问题吗?如果是,我该如何解决?

【问题讨论】:

    标签: php excel datetime


    【解决方案1】:

    MS Excel 日期/时间值是浮点数,不是格式化字符串或任何其他特殊数据类型;只有数字格式掩码才能将它们与任何其他浮点数区分开来

    getCalculatedValue() 将处理任何公式,但不会应用任何格式,因此您只需返回浮点值

    然而

    getFormattedValue() 将为单元格计算任何公式,但也会应用任何数字格式掩码,因此“日期”将作为格式化字符串返回,具体取决于该单元格的数字格式掩码

    编辑

    返回的格式化字符串取决于使用的数字格式掩码....不幸的是,一些 MS Excel 日期格式掩码可以识别区域设置,但 PHPExcel 不是,因此如果单元格使用这些掩码之一,则结果可能不是格式化为你想要的。

    您可以使用您选择的格式掩码为单元格值应用手动格式:

    $result = PHPExcel_Style_NumberFormat::toFormattedString(
        $cell->getCalculatedValue(),
        PHPExcel_Style_NumberFormat::FORMAT_DATE_DDMMYYYY
    );
    

    $result = PHPExcel_Style_NumberFormat::toFormattedString(
        $cell->getCalculatedValue(),
        'dd/mm/yy'
    );
    

    或者,您可以使用将 MS Excel 序列化时间戳转换为 unix 时间戳

    $result = PHPExcel_Shared_Date::ExcelToPHP(
        $cell->getCalculatedValue()
    );
    

    或 PHP DateTime 对象

    $result = PHPExcel_Shared_Date::ExcelToPHPObject(
        $cell->getCalculatedValue()
    );
    

    然后使用普通的 PHP date()DateTime::format() 掩码来设置你想要的格式

    编辑#2

    识别单元格是否包含日期:

    if (PHPExcel_Shared_Date::isDateTime($cell)) {
        echo 'Cell ', $cell->getCoordinate(), ' contains a date value';
    }
    

    【讨论】:

    • 谢谢!这行得通。无论如何,我得到02-28-15 而不是28/02/15。我需要告诉 PHPExcel_Cell 我需要哪种格式吗?
    • 好的,但是如果我不知道单元格内容是字符串、数字还是日期怎么办?我有一个 FOR 来提取一行的所有单元格值,它不是所有日期
    • 查看编辑 #2 以识别包含日期值的单元格
    猜你喜欢
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2023-04-01
    • 2014-05-13
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多