2010-07-16 51 views
6

Encontré un problema extraño al configurar un formato de fecha personalizado con PHPExcel: estoy escribiendo una fecha formateada sql en una celda y establezco su formato con setFormatCode en 'd/m/y '. Cuando lo abro en Excel 2007, muestra el formato de fecha original hasta que haga doble clic en la celda y luego se actualiza a mi formato deseado. ¿Hay alguna manera de refrescarlo sin que yo ayude?Formato personalizado de celda PHPExcel solo se muestra al hacer doble clic

$sheet->setCellValueByColumnAndRow($column, $row, '2010-07-16'); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

Respuesta

13

A menos que utilice "Valor Carpeta avanzada" de PHPExcel, a continuación, del tipo de hoja $> setCellValueByColumnAndRow (columna $, $ fila, '2010-07-16'); almacenará el valor como una cadena, no como una fecha, por lo que el formato de fecha que está configurando en la siguiente línea no tiene sentido cuando se aplica a una cadena hasta que lea el archivo resultante en Excel y fuerce una actualización ... Excel sí mismo luego corrige tu error

Para asegurarse de que el valor se almacena correctamente en primer lugar, debe almacenarlo como una fecha/marca de tiempo/número en lugar de una cadena, luego configure la máscara de formato para asegurarse de que se trata como una fecha/marca de tiempo en lugar de un valor numérico

Cualquiera de convertir su cadena a una fecha de PHP usando strtotime(), a continuación, utilizar de PHPExcel construida en los métodos de conversión de la fecha:

$PHPDateValue = strtotime('2010-07-16'); 
$ExcelDateValue = PHPExcel_Shared_Date::PHPToExcel($PHPDateValue); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

o utilizar el método integrado para convertir una cadena de fecha con formato a un Excel valor de fecha y hora directamente

$dateString = '2010-07-16'; 
$ExcelDateValue = PHPExcel_Shared_Date::stringToExcel($dateString); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

o utilizar la función de la biblioteca de funciones de motores de cálculo DATEVALUE():

$dateString = '2010-07-16'; 
$ExcelDateValue = PHPExcel_Calculation_Functions::DATEVALUE($dateString); 
$sheet->setCellValueByColumnAndRow($column, $row, $ExcelDateValue); 
$sheet->getStyleByColumnAndRow($column, $row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_DMYSLASH); 

o, opción 4, es el uso de "Carpeta Valor avanzada" de PHPExcel

Para activar esta función, ejecute la siguiente llamada estática

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_AdvancedValueBinder()); 

antes instancia su objeto de libro, o cargarlo desde el archivo

Entonces PHPExcel identificará que su valor es una fecha, y manejar la conversión a una fecha de Excel/marca de tiempo y el formato de forma automática

$dateString = '2010-07-16'; 
$sheet->setCellValueByColumnAndRow($column, $row, $dateString); 
+0

Esa es una gran respuesta. ¡Gracias! – ISBL

+0

No puede estar mal si es respondido por uno de los creadores de PHPExcel él mismo –

1

Me gustaría añadir una opción 5 ...

Si desea utilizar esto con SetValueExplicit que podría hacerlo de esta manera:

\\convert bDate to dDate 
$dDate = PHPExcel_Shared_Date::PHPToExcel(strtotime($bDate)); 

\\must use type numeric 
$worksheet->getCell($col_row)->setValueExplicit($dDate,PHPExcel_Cell_DataType::TYPE_NUMERIC); 
\\use FORMAT_DATE of your choice i am using "YYYY-MM-DD" 
$worksheet->getStyle($col_row)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2); 

Tenga en cuenta que los formatos de fecha en la documentación y en línea parece estar desactualizado Para obtener una lista completa de los diferentes tipos de FORMAT_DATE_XYZ, simplemente busque en el archivo PHPExcel \ Style \ Number_Format.php en su copia de la biblioteca.

Probablemente sea más fácil usar el Encuadernador de valor avanzado, pero si no puede o no desea, entonces con suerte esta información le ha sido útil.

Cuestiones relacionadas