2010-07-16 9 views
6

j'ai rencontré un problème bizarre établissement d'un format de date personnalisé avec PHPExcel: J'écris une date au format sql à une cellule et la mise en son format avec setFormatCode à « d/m/y '. Lorsque je l'ouvre dans Excel 2007, il affiche le format de date orignial jusqu'à ce que je clique deux fois sur la cellule puis qu'elle soit mise à jour au format souhaité. Y a-t-il un moyen de se rafraîchir sans que j'aide?format de cellule personnalisé PHPExcel affiche uniquement après double-cliquez sur

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

Répondre

13

À moins que vous utilisez "Advanced Value Binder" de PHPExcel, puis $ feuillet-> setCellValueByColumnAndRow (colonne $, $ row, '2010-07-16'); stockera la valeur sous la forme d'une chaîne, pas comme une date, donc le format de date que vous définissez dans la ligne suivante est inutile lorsqu'il est appliqué à une chaîne jusqu'à ce que vous lisiez le fichier résultant dans Excel et forcer un rafraîchissement ... Excel lui-même puis corrige votre erreur. Pour garantir que la valeur est correctement stockée en premier lieu, vous devez la stocker en tant que date/horodatage/numéro plutôt qu'une chaîne, puis définir le masque de format pour s'assurer qu'il est traité comme date/horodatage plutôt qu'une valeur numérique.

Soit convertir votre chaîne à une date de PHP en utilisant strtotime(), puis utilisez les méthodes intégrées de conversion date de PHPExcel:

$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); 

ou utiliser la méthode intégrée pour convertir une chaîne de date formatée dans un fichier Excel valeur datetime directement

$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); 

ou utiliser la fonction DATEVALUE() de la bibliothèque de fonctions de calcul des moteurs:

$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); 

ou, option 4, est d'utiliser « Advanced Value Binder » de PHPExcel

Pour activer cette fonction, exécuter l'appel statique suivant

PHPExcel_Cell::setValueBinder(new PHPExcel_Cell_AdvancedValueBinder()); 

avant instanciez votre objet classeur ou le charger à partir du fichier

Alors PHPExcel identifierons que votre valeur est une date, et gérer la conversion à une date Excel/horodatage et le format automatiquement

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

Voilà une excellente réponse. Je vous remercie! – ISBL

+0

Il ne peut pas se tromper si l'un des créateurs de PHPExcel lui répond –

1

Je voudrais ajouter une option 5 ...

Si vous voulez utiliser avec SetValueExplicit vous ferait de cette façon:

\\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); 

S'il vous plaît noter que les formats de date dans la documentation en ligne et semblent être périmés. Pour une liste complète de tous les différents types de FORMAT_DATE_XYZ il suffit de regarder dans le fichier PHPExcel \ Style \ Number_Format.php dans votre copie de la bibliothèque.

Il est probablement plus facile d'utiliser seulement la valeur avancée Binder mais si vous ne pouvez pas ou ne voulez pas alors nous espérons que cette information a été utile pour vous.