PHPExcel toArray正在改变XLSX格式的date和时间列

我正在使用这里find的excelToArray函数: https ://gist.github.com/calvinchoy/5821235

function excelToArray($filePath, $header = true) { require_once("./PHPExcel/Classes/PHPExcel.php")); //Create excel reader after determining the file type $inputFileName = $filePath; /** Identify the type of $inputFileName **/ $inputFileType = PHPExcel_IOFactory::identify($inputFileName); /** Create a new Reader of the type that has been identified **/ $objReader = PHPExcel_IOFactory::createReader($inputFileType); /** Set read type to read cell data onl **/ $objReader->setReadDataOnly(true); /** Load $inputFileName to a PHPExcel Object **/ $objPHPExcel = $objReader->load($inputFileName); //Get worksheet and built array with first row as header $objWorksheet = $objPHPExcel->getActiveSheet(); //excel with first row header, use header as key if($header){ $highestRow = $objWorksheet->getHighestRow(); $highestColumn = $objWorksheet->getHighestColumn(); $headingsArray = $objWorksheet->rangeToArray('A1:'.$highestColumn.'1',null, true, true, true); $headingsArray = $headingsArray[1]; $r = -1; $namedDataArray = array(); for ($row = 2; $row <= $highestRow; ++$row) { $dataRow = $objWorksheet->rangeToArray('A'.$row.':'.$highestColumn.$row,null, true, true, true); if ((isset($dataRow[$row]['A'])) && ($dataRow[$row]['A'] > '')) { ++$r; foreach($headingsArray as $columnKey => $columnHeading) { $namedDataArray[$r][$columnHeading] = $dataRow[$row][$columnKey]; } } } } else{ //excel sheet with no header $namedDataArray = $objWorksheet->toArray(null,true,true,true); } return $namedDataArray; } 

我有两个版本的电子表格,一个是CSV,一个是Excel。 他们来了:

CSV: https : //drive.google.com/open? id = 0B2GilRTNrTzKd3V3aEVET1NqSW8

XLSX: https ://drive.google.com/open ? id = 0B2GilRTNrTzKdzJNZnh0cmhpa1E

当我使用这个函数上传CSVvar_dump ,我得到的结果

 array (size=58) 0 => array (size=4) 'PD' => string '11/10/2016' (length=10) 'Pt' => string '9:12' (length=4) 'fd' => string '11/10/2017' (length=10) 'ft' => string '9:12' (length=4) 1 => array (size=4)... 

但是当我上传XLSX时,我得到:

 array (size=58) 0 => array (size=5) 'PD' => float 42684 'Pt' => float 0.38333333333333 'fd' => float 43049 'ft' => float 0.38333333333333 '' => null 1 => array (size=5) 

请注意,PD从11/10/2016到42684,Pt从9:12到0.38333 …

是什么导致XLSX文件不能被读入,因为它显示?

我已经阅读了其他的堆栈问题 ,但是我似乎正在传递正确的价值观 。 不知道我错过了什么…

MS Excel将date存储为序列化时间戳,自1900年1月1日(或1904年1月1日,取决于它是使用Windows还是Mac日历)以来的天数。 PHPExcel也是如此,因此所有的date/时间都被加载到电子表格对象中,与MS Excel一起工作。

所以,当你加载一个带有人格格式date的文件时,它会将其作为MS Excel序列化的时间戳。 通常,它还会存储数字格式掩码,告诉PHPExcel这个单元格包含一个时间戳值,该值被格式化为一个date,但是您要告诉PHPExcel的加载程序不要使用$objReader->setReadDataOnly(true); 这意味着只存储数据,而不是格式化信息。 因为PHPExcel没有提供这个额外的格式化信息,所以它不能知道单元格包含了应该作为date显示的东西,所以它只能显示序列化的平行信号,这实际上只是一个浮点数。

换句话说,不要做$objReader->setReadDataOnly(true); 如果你想date被视为date,或者除非你想自己做所有的date