如何使用ExcelBundle [Symfony Bundle]阅读日期

时间:2015-03-26 14:13:23

标签: php excel datetime

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

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

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

1 个答案:

答案 0 :(得分:3)

MS Excel日期/时间值是浮点数,而不是格式化字符串或任何其他特殊数据类型;并且它只是数字格式化掩码,区别于任何其他浮动

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

然而

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

修改

返回的格式化字符串取决于所使用的数字格式掩码....遗憾的是,某些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';
}