在尝试使用DateTime单元格的$cell->getCalculatedValue()
读取单元格值时遇到问题。
excel文件的值是28/2/15
(格式为d/m/y),但我得到的是42063
。
这是格式问题吗?如果是,我该怎么解决?
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';
}