我正在尝试使用PhpExcel lib为该getValue()函数的所有其他字段导入excel文件但是当遇到ms-excel2013中设置的格式日期的字段时,exel文件中的日期字段格式为dmY,16-11-2014
但是当我尝试导入时它的值是getValue()返回的11-16-14结果,strtotime进而进一步returns false导致date('Y-m-d',strtotime($date))返回1970-01-01.
我搜索了整个web和stackoverflow但没有解决方案解决了我的问题.在excel文件中,我将日期视为16-11-2014并希望按原样导入.
这是代码
protected function importExcel($filePath) {
$excelData = array();
if ($filePath) {
$objPHPExcel = PHPExcel_IOFactory::load($filePath);
$objPHPExcel->setReadDataOnly(true);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
$worksheetTitle = $worksheet->getTitle();
$highestRow = $worksheet->getHighestRow(); // e.g. 10
$highestColumn = $worksheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
$nrColumns = ord($highestColumn) - 64;
$data = array();
for ($row = 1; $row <= $highestRow; ++$row) {
$values = array();
for ($col = 0; $col < $highestColumnIndex; ++$col) {
$cell = $worksheet->getCellByColumnAndRow($col, $row);
if (PHPExcel_Shared_Date::isDateTime($cell))
throw new Exception("is date time"); // just a check
$val = $cell->getValue();
if (isset($val) && $val)
$data[$row][$col] = $val;
}
}
$excelData[$worksheetTitle] = $data;
}
return $excelData;
}
return FALSE;
}
Run Code Online (Sandbox Code Playgroud)
getValue()对包含日期的字段的调用应该返回一个值41959.00如果该字段确实包含MS Excel日期值....即,基于自1900年1月1日(或1日)以来的天数的MS Excel序列化日期时间戳1904年1月如果文件是使用Mac版的MS Excel创建的)
要获取格式化的日期字符串,您需要调用 getFormattedValue() ; 然后,PHPExcel使用该单元格的数字格式掩码根据该掩码格式化日期.
要识别单元格是否包含MS序列化日期时间戳,您可以先使用调用PHPExcel_Shared_Date::isDateTime().
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
echo 'Worksheet - ' , $worksheet->getTitle() , EOL;
foreach ($worksheet->getRowIterator() as $row) {
echo ' Row number - ' , $row->getRowIndex() , EOL;
$cellIterator = $row->getCellIterator();
$cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
foreach ($cellIterator as $cell) {
if (!is_null($cell)) {
echo ' Cell - ' , $cell->getCoordinate() , ' - ';
if (PHPExcel_Shared_Date::isDateTime($cell)) {
echo $cell->getFormattedValue() , EOL;
} else {
echo $cell->getValue() , EOL;
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您也可以要求PHPExcel将日期作为Unix时间戳返回,或者作为PHP DateTime对象返回,而不是返回格式化的数据值; 然后你可以使用PHP的内置日期函数或DateTime方法格式化它.
if (PHPExcel_Shared_Date::isDateTime($cell)) {
$unixTimeStamp = PHPExcel_Shared_Date::ExcelToPHP($cell->getValue());
echo date('d-M-Y H:i:s', $unixTimeStamp), PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
要么
if (PHPExcel_Shared_Date::isDateTime($cell)) {
$dateTimeObject = PHPExcel_Shared_Date::ExcelToPHPObject($cell->getValue());
echo $dateTimeObject->format('d-M-Y H:i:s'), PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
我已经找到了解决方案:
文件PHPExcel/Style/NumberFormat.php中的方法_formatAsDate
如果日期类似于16/11/2014,则传递给时strtotime将导致false日期的格式应该m/d/Y为strtotime。因此,如果您将格式更改为m/d/Yif it'sd/m/Y那么解决方案将始终是正确的。
代码仍然相同,导入文件也很简单:
protected function importExcel($filePath) {
$excelData = array();
if ($filePath) {
$objPHPExcel = PHPExcel_IOFactory::load($filePath);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
$worksheetTitle = $worksheet->getTitle();
$highestRow = $worksheet->getHighestRow(); // e.g. 10
$highestColumn = $worksheet->getHighestColumn(); // e.g 'F'
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
$nrColumns = ord($highestColumn) - 64;
$data = array();
for ($row = 1; $row <= $highestRow; ++$row) {
$values = array();
for ($col = 0; $col < $highestColumnIndex; ++$col) {
$cell = $worksheet->getCellByColumnAndRow($col, $row);
$val = $cell->getValue();
if (isset($val) && $val)
$data[$row][$col] = $val;
}
}
$excelData[$worksheetTitle] = $data;
}
return $excelData;
}
return FALSE;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18576 次 |
| 最近记录: |