PHPEXCEL obtener la fecha formateada como es visible en el archivo de Excel

Estoy tratando de importar un archivo Excel utilizando PhpExcel lib para todos los demás campos, la función getValue() funciona pero cuando encuentra un campo con fecha de formato como se establece en ms-excel2013 el campo de fecha en el archivo exel está en formato dmY como 16-11-2014 pero cuando bash importar su valor, getValue() devuelve 11-16-14 que, cuando pasa a strtotime , returns false a su vez, lo que hace que la date('Ym-d',strtotime($date)) regrese a 1970-01-01 .

Busqué en toda la web y stackoverflow pero ninguna solución solucionó mi problema. En el archivo de Excel, veo la fecha como 16-11-2014 y quiero que se importe tal como está.

Aquí está el código

 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(); // eg 10 $highestColumn = $worksheet->getHighestColumn(); // eg 'F' $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); $nrColumns = ord($highestColumn) - 64; $data = array(); for ($row = 1; $row <= $highestRow; ++$row) { $values = array(); for ($col = 0; $col 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; } 

Aquí está el archivo
Gracias por adelantado

Una llamada a getValue() en un campo que contiene una fecha debe devolver un valor como 41959.00 si ese campo realmente contiene un valor de fecha de MS Excel … es decir, un sello de fecha y hora serializado de MS Excel basado en el número de días desde el 1 de enero 1900 (o el 1 de enero de 1904 si el archivo fue creado usando la versión Mac de MS Excel)

Para obtener una cadena de fecha formateada, debe llamar a getFormattedValue() lugar; y PHPExcel luego usa la máscara de formato de número para esa celda para formatear la fecha de acuerdo con esa máscara.

Para identificar si una celda contiene un sello de fecha y hora serializado MS, puede usar una llamada a PHPExcel_Shared_Date::isDateTime() primero.

 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; } } } } } 

En lugar de devolver un valor de datos formateado, también puede solicitarle a PHPExcel que devuelva la fecha como una marca de tiempo Unix, o como un objeto DateTime de PHP; y luego podrás formatearlo como quieras usando las funciones de fecha incorporadas de PHP o los métodos DateTime.

 if (PHPExcel_Shared_Date::isDateTime($cell)) { $unixTimeStamp = PHPExcel_Shared_Date::ExcelToPHP($cell->getValue()); echo date('dMY H:i:s', $unixTimeStamp), PHP_EOL; } 

o

 if (PHPExcel_Shared_Date::isDateTime($cell)) { $dateTimeObject = PHPExcel_Shared_Date::ExcelToPHPObject($cell->getValue()); echo $dateTimeObject->format('dMY H:i:s'), PHP_EOL; } 

Revisé el archivo que me proporcionó, mirando el asunto de su fecha.

El formato que está utilizando para esas fechas en su hoja de cálculo es un formato de fecha compatible con la configuración regional, marcado por MS Excel con un asterisco (*) si observa el formato de la celda

Esto significa (citando notas de Excel en la pantalla de máscara de formato):

Los formatos de fecha que comienzan con un asterisco (*) responden a los cambios en las configuraciones regionales de fecha y hora que se especifican para el sistema operativo.

Como PHPExcel no es compatible con la configuración regional, pero reconoce la máscara de formato como un valor de fecha, utiliza un formato genérico.


Ejecutando el siguiente código

 var_dump($objPHPExcel->getActiveSheet()->getCell('I5')->getValue()); var_dump(PHPExcel_Shared_Date::isDateTime($objPHPExcel->getActiveSheet()->getCell('I5'))); var_dump($objPHPExcel->getActiveSheet()->getCell('I5')->getStyle()->getNumberFormat()->getFormatCode()); var_dump($objPHPExcel->getActiveSheet()->getCell('I5')->getFormattedValue()); 

da

 float(42062) bool(true) string(8) "mm-dd-yy" string(8) "02-27-15" 

Entonces (siempre que haya eliminado esa setReadDataOnly(true) del Reader, llame desde Reader, aún puede identificar las celdas de fecha como fechas, y formateelas manualmente, anulando el formato de locale predeterminado

 if (PHPExcel_Shared_Date::isDateTime($objPHPExcel->getActiveSheet()->getCell('I5'))) { $dateTimeObject = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('I5')->getValue()); echo $dateTimeObject->format('dm-Y'), PHP_EOL; } 

He encontrado la solución:

Método _formatAsDate en el archivo PHPExcel / Style / NumberFormat.php

El método _formatAsDate in NumberFormat.php

si la fecha es 16/11/2014 , cuando pase al strtotime resultará en false ya que se supone que la fecha está en formato m/d/Y por strtotime . Entonces, si cambia el formato a m/d/Y si es d/m/Y entonces la solución siempre será correcta.

Más temprano:

  1. 16/11/2014 == 1970-01-01 (Fila: 1)
  2. 16/11/2014 == 1970-01-01 (Fila: 2)
  3. 23/12/2014 == 1970-01-01 (Fila: 3).

Ahora:

  1. 16/16/2014 == 2014-11-16 (Fila: 1)
  2. 16/16/2014 == 2014-11-16 (Fila: 2)
  3. 23/12/2014 == 2014-12-23 (Fila: 3)

El código sigue siendo el mismo y simple para importar el archivo:

 protected function importExcel($filePath) { $excelData = array(); if ($filePath) { $objPHPExcel = PHPExcel_IOFactory::load($filePath); foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) { $worksheetTitle = $worksheet->getTitle(); $highestRow = $worksheet->getHighestRow(); // eg 10 $highestColumn = $worksheet->getHighestColumn(); // eg '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; }