使用PHPExcel为单元格设置正确的读取格式


Set correct reading format for a cell with PHPExcel

我正在使用PHPExcel来读取Excel 2007文档。在这个文档中有一个"时间"格式的列,它在Excel中正确显示数据。当我试图解析这一列时,我得到了一些奇怪的值。知道我该怎么解决这个问题吗?

谢谢。

在解析时,需要指定列的格式。例如

$my_cell = $objWorksheet->getCellByColumnAndRow(1, 1);
$my_cell_value = PHPExcel_Style_NumberFormat::toFormattedString($cell->getCalculatedValue(), 'hh:mm:ss');
print $my_cell_value;

奇怪的值?!?你的意思是你得到一个数字,而不是一个人类可读的日期字符串....在可能的情况下准确地描述事物总是有帮助的,而怪异并不是一个准确的描述。

如果你只是从单元格中获取值,你将读取一个原始时间戳值(MS Excel保存日期和时间值作为时间戳;与PHP中的Unix时间戳值类似,只是Excel的时间戳是自1900年1月1日(或1904年1月1日,取决于配置使用的日历)以来的天数。

MS Excel使用数字格式屏蔽将时间戳显示为人类可读的日期/时间字符串。

您可以使用getFormattedValue()方法而不是简单的getValue()来检索这个格式化的日期/时间(getFormattedValue()将单元格的任何数字格式掩码应用于值)。并不是说,如果你加载了readDataOnly设置为TRUE的文件,那么数字格式掩码不会被加载,所以PHPExcel无法识别单元格是否包含日期。

或者,正如James在他的回答中建议的那样,您可以通过使用您自己的格式掩码应用数字格式来手动将原始时间戳转换为格式化值

第三种选择是,你可以使用PHPExcxel的内置日期处理函数将这个Excel时间戳值转换为PHP/unix时间戳或PHP DateTime对象(分别为PHPExcel_Shared_Date::ExcelToPHP()和PHPExcel_Shared_Date::ExcelToPHPObject())。然后可以使用PHP自己的日期处理函数

显示

存储在Excel中的时间值实际上是一天的小数,因此0.2等于24小时(或1440分钟或86400秒)乘以0.2。您可以根据这些信息计算一天的时间,然后从一天的开始计算。它使它比格式化的时间更有用,但可读性差很多。