web-dev-qa-db-fra.com

comment obtenir la date d'Excel à l'aide de la bibliothèque PHPExcel

J'essaie d'obtenir Date d'Excel à l'aide de PHPExcel. Mais je n’obtiens pas de date, j’obtiens une valeur de chaîne qui n’est pas de quelques secondes à partir de 1970.

Le code que j'ai essayé est 

$InvDate=trim($Excel->getActiveSheet()->getCell('B' . $i)->getValue());
27
user2934950

Essayez d'utiliser 

$cell = $Excel->getActiveSheet()->getCell('B' . $i);
$InvDate= $cell->getValue();
if(PHPExcel_Shared_Date::isDateTime($cell)) {
     $InvDate = date($format, PHPExcel_Shared_Date::ExcelToPHP($InvDate)); 
}

P.S.

@DiegoDD: Devrait mentionner que $ format est le format souhaité pour la date. par exemple.:

 $InvDate = date($format = "Y-m-d", PHPExcel_Shared_Date::ExcelToPHP($InvDate)); 

P.P.S . 2019 Consultez answer @ gabriel-lupu avec la nouvelle version de PhpOffice https://stackoverflow.com/a/45070205/426533

54
Sergey

Pour une date, getValue () devrait renvoyer un float, qui est la valeur timestamp séquentielle Excel pour cette date/heure ... Je suppose que c'est votre trim () qui le transforme en chaîne. La valeur réelle est le nombre de jours depuis le 1/1/1900 (ou le 1/1/1904 en fonction du calendrier utilisé par la feuille de calcul).

L'appel de getFormattedValue () ou getCalculatedValue () au lieu de getValue () devrait renvoyer la date au format chaîne lisible par l'homme en fonction du masque numberformatmask de la cellule.

Sinon, la solution de Sergey vérifie si la cellule a un masque de date/heure numberformatmask et appelle la méthode d'assistance appropriée pour convertir cet horodatage sérialisé Excel en un horodatage unix, puis utilise la fonction de date PHP normale pour la formater en tant que lisible par l'homme la valeur de $ format. Une méthode d'assistance similaire, PHPExcel_Shared_Date :: ExcelToPHPObject (), convertira un horodatage Excel sérialisé en un objet PHP DateTime.

13
Mark Baker

Dans la nouvelle version de la bibliothèque, PhpOffice , la fonction qui le gère est excelToDateTimeObject le nouveau format de code devrait donc être:

$cell = $Excel->getActiveSheet()->getCell('B' . $i);
$InvDate= $cell->getValue();
if (PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cell)) {
     $InvDate = PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($InvDate); 
}
1
Gabriel Lupu

Vous pouvez obtenir les valeurs de cellule sous forme de chaîne (également les valeurs de date) de cette façon:

$sheet = $objPHPExcel->getActiveSheet();
$lastRow = $sheet->getHighestRow();
$lastColumn = $sheet->getHighestColumn();

$rows = $sheet->rangetoArray('A2:'.$lastColumn . $lastRow, NULL, True, True, False);
foreach ($rows as $row => $cols) {
    foreach($cols as $col => $cell) {
        echo trim($cell).'<br>'; // Gives the value as string
    }
}
0
shasi kanth