PHPExcel toArray 正在从 XLSX 格式更改日期和时间列
PHPExcel toArray is changing date and time columns from XLSX format
我正在使用此处找到的 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
当我使用此功能上传 CSV 并且 var_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 文件在显示时无法读入?
我已经read other stack questions, but I appear to be passing toArray the correct values了。不确定我错过了什么...
MS Excel 将日期存储为序列化时间戳,即自 1900 年 1 月 1 日(或 1904 年 1 月 1 日,取决于它使用的是 Windows 还是 Mac 日历)。 PHPExcel 也是如此,因此所有 dates/times 都按照 MS Excel 处理它们的方式加载并存储在电子表格对象中。
因此,当您加载具有人类格式日期的文件时,它会将其读取为 MS Excel 序列化时间戳。通常,它还会存储数字格式掩码,告诉 PHPExcel 这个单元格包含一个时间戳值,应该将其格式化为日期,但你告诉 PHPExcel 的加载程序不通过使用 $objReader->setReadDataOnly(true);
执行此附加操作,这意味着仅存储数据,而不存储格式信息。
因为 PHPExcel 没有这个额外的格式信息,它不知道单元格包含应该作为日期显示的东西,所以它只能显示序列化的时间戳,这实际上只是一个浮动。
换句话说,如果您希望将日期视为日期,或者除非您想自己处理所有日期,请不要执行 $objReader->setReadDataOnly(true);
我正在使用此处找到的 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
当我使用此功能上传 CSV 并且 var_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 文件在显示时无法读入?
我已经read other stack questions, but I appear to be passing toArray the correct values了。不确定我错过了什么...
MS Excel 将日期存储为序列化时间戳,即自 1900 年 1 月 1 日(或 1904 年 1 月 1 日,取决于它使用的是 Windows 还是 Mac 日历)。 PHPExcel 也是如此,因此所有 dates/times 都按照 MS Excel 处理它们的方式加载并存储在电子表格对象中。
因此,当您加载具有人类格式日期的文件时,它会将其读取为 MS Excel 序列化时间戳。通常,它还会存储数字格式掩码,告诉 PHPExcel 这个单元格包含一个时间戳值,应该将其格式化为日期,但你告诉 PHPExcel 的加载程序不通过使用 $objReader->setReadDataOnly(true);
执行此附加操作,这意味着仅存储数据,而不存储格式信息。
因为 PHPExcel 没有这个额外的格式信息,它不知道单元格包含应该作为日期显示的东西,所以它只能显示序列化的时间戳,这实际上只是一个浮动。
换句话说,如果您希望将日期视为日期,或者除非您想自己处理所有日期,请不要执行 $objReader->setReadDataOnly(true);