web-dev-qa-db-fra.com

PHPExcel: comment définir le format de date pour une cellule

J'ai besoin d'enregistrer une date dans un fichier Excel, elle doit être sortie au format "jj/mm/aaaa" (ou le format de date local de l'utilisateur), et être traitée comme une date afin qu'une colonne d'entre eux puisse être triée correctement .

Voici le code:

<?php
include_once("../PHPExcel/Classes/PHPExcel.php");
date_default_timezone_set('Europe/London');
$objPHPExcel = new PHPExcel();
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);

$objPHPExcel = new PHPExcel();
$sheet = $objPHPExcel->getActiveSheet();
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

//I didn't find dd/mm/yyyy format, so I used yyyy-mm-dd
$sheet->setCellValueByColumnAndRow(0, 1, "2014-10-16");
$sheet->getStyleByColumnAndRow(0, 1)
    ->getNumberFormat()->setFormatCode(
        PHPExcel_Style_NumberFormat::FORMAT_DATE_YYYYMMDD2
);

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save("test.xlsx");

Il crée un fichier, mais au lieu de mon format de date local, je vois: "2014-10-16" et le format de la cellule est "Tous les formats" -> "aaaa-mm-jj". Je voulais qu'il soit analysé et sorti dans mon format de date local.

J'ai regardé le code source de PHPExcel/Classes/PHPExcel/Style/NumberFormat.php, et a trouvé de nombreux formats de date:

const FORMAT_DATE_YYYYMMDD2 = 'yyyy-mm-dd';
const FORMAT_DATE_YYYYMMDD = 'yy-mm-dd';
const FORMAT_DATE_DDMMYYYY = 'dd/mm/yy';
const FORMAT_DATE_DMYSLASH = 'd/m/y';
const FORMAT_DATE_DMYMINUS = 'd-m-y';
...

Mais je ne sais pas quoi utiliser. Comment puis-je atteindre l'objectif souhaité?

5
user4035
$sheet->setCellValueByColumnAndRow(0, 1, "2014-10-16");

Définit une valeur chaîne dans la cellule, pas une date. Ce n'est pas parce que vous interprétez cela comme une date que les programmes informatiques l'interprètent automatiquement comme une date.

Regardez les exemples de date dans PHPExcel Documentation et Exemples , et vous verrez que vous devez définir la valeur de la cellule sur un horodatage sérialisé MS Excel (une valeur flottante de le nombre de jours depuis le 1er janvier 1900). Vous pouvez utiliser les fonctions PHPExcel comme PHPExcel_Shared_Date::PHPToExcel() pour convertir des dates humaines/des objets PHP DateTime/des horodatages Unix en horodatages sérialisés MS Excel.

$sheet->setCellValueByColumnAndRow(0, 1, PHPExcel_Shared_Date::PHPToExcel( '2014-10-16' ));

Une fois que vous avez stocké la valeur comme horodatage, vous pouvez ensuite appliquer le masque de format de date que vous souhaitez à cette cellule pour obtenir la mise en forme souhaitée

5
Mark Baker

Ce code génère 4 cellules au format date.

<?php
include_once("../PHPExcel/Classes/PHPExcel.php");
date_default_timezone_set('Europe/London');
$objPHPExcel = new PHPExcel();
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_in_memory_gzip;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);

$objPHPExcel = new PHPExcel();
$sheet = $objPHPExcel->getActiveSheet();
PHPExcel_Shared_Font::setAutoSizeMethod(PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT);

$format = 'dd/mm/yyyy';
for ($i = 1; $i < 5; ++$i)
{
    $date = new DateTime('2016-12-0'.$i);
    $sheet->setCellValueByColumnAndRow(0, $i, 
                                       PHPExcel_Shared_Date::PHPToExcel( $date ));

    $sheet->getStyleByColumnAndRow(0, $i)
        ->getNumberFormat()->setFormatCode($format);
}

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save("test.xlsx");
5
user4035