SOFTELメモ

Softel Inc.

【PhpSpreadsheet】日付型のセルから読みだした値を日付にする

問題

Excelの日付型のカラムの値を getValue や getCalculatedValue で取得すると、タイムスタンプでもない謎の数値が取得されます。

例)
2018/5/13 11:26 → 43233.476388889
2018/5/13 → 43233

yyyy-mm-dd の日付型の文字列が欲しいのですが、どうしたらよいですか。

答え

日付型のセルの値を読み取ると、Excelの日付のシリアル値が取得されます。

これを日付型の文字列にしたり、DateTimeオブジェクトにしたりするには、以下のように、excelToTimestamp、excelToDateTimeObjectを使用するとできます。

<?php
require '/mnt/c/var/lib/vendor/autoload.php';

$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load('test.xlsx');

$worksheet = $spreadsheet->getSheet(0);

$x = $worksheet->getCell('N2')->getValue();
$x = date('Y-m-d H:i:s', PhpOffice\PhpSpreadsheet\Shared\Date::excelToTimestamp($x));
var_dump($x); // → string(19) "2018-05-13 20:26:00"

$x = $worksheet->getCell('N3')->getValue();
$x = PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($x)->format('Y-m-d');
var_dump($x); // → string(10) "2018-05-13

関連するメモ

コメント