web-dev-qa-db-ja.com

PHPExcelライブラリを使用してExcelから日付を取得する方法

PHPExcelを使用してExcelから日付を取得しようとしています。しかし、私は日付を取得していません。1970年からの秒ではない文字列値を取得しています。

私が試したコードは

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

使用してみてください

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

追伸.

@DiegoDD:$ formatが日付の望ましい形式であることを言及する必要があります。例えば。:

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

P.P.S. 2019回答@ gabriel-lupuを見て、PhpOfficeの新しいバージョンで https://stackoverflow.com/a/45070205/4265

56
Sergey

日付の場合、getValue()はfloatを返す必要があります。これは、その日付/時刻のExcelシリアル化タイムスタンプ値です。文字列にキャストしているのはtrim()であると思われます。実際の値は、1/1/1900(またはスプレッドシートが使用しているカレンダーに応じて1/1/1904)以降の日数です。

GetValue()の代わりにgetFormattedValue()またはgetCalculatedValue()を呼び出すと、セルのnumberformatmaskに従って人間が読める文字列としてフォーマットされた日付が返されます。

または、セルに日付/時刻の数値フォーマットマスクがあるかどうかをテストし、適切なヘルパーメソッドを呼び出してそのExcelシリアル化タイムスタンプをUNIXタイムスタンプに変換し、通常のPHP date関数を使用してフォーマットします$ formatの値に応じて人間が読み取れるようになります。Excelシリアル化タイムスタンプをPHP DateTimeオブジェクトに変換する同様のヘルパーメソッドPHPExcel_Shared_Date :: ExcelToPHPObject()があります。

13
Mark Baker

新しいバージョンのライブラリ PhpOffice では、これを処理する関数は excelToDateTimeObject であるため、新しいコード形式は次のようになります。

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

この方法でセル値を文字列(日付値も)として取得できます。

$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