SOFTELメモ

Softel Inc.

【php】PHPExcelで日付型のセルに日付として値を入れる方法

問題

PHPExcelで既存のExcelを開いて書き込みをする処理を作っています。

書式設定が日付型の列があるのですが、setCellValue(‘2019/07/07’) などすると、文字列で 2019/07/07 が入るようです。

PHPExcelで日付を入れたところ

Excelに日付として認識してもらうにはどうすればよいですか?

答え

Excelに日付を認識してもらうには、Excelの日付のシリアル値で書き込まないといけない。

そのための関数が用意されている(PHPExcel_Shared_Date::PHPToExcel)。

PHPExcelのバージョンによっても動作が違うようなので、環境に応じてうまくいく方法を選択してください。

罠1

単純に文字列の 2019/07/07 が入る。

$sheet->setCellValue("A1", "2019/07/07");

罠2

2019/7/6 15:00:00 になる。日本の 7/7 は世界標準時の 7/6 15時ということらしい。

$excelDateValue = PHPExcel_Shared_Date::PHPToExcel(strtotime("2019/07/07"));
$sheet->setCellValue("A1", $excelDateValue);

これでよい?

ちゃんと 2019/7/7 になる

$excelDateValue = PHPExcel_Shared_Date::PHPToExcel(strtotime('2019/07/07') + 60*60*9);
$sheet->setCellValue("A1", $excelDateValue);

これでよい?

ちゃんと 2019/7/7 になる

$tz_utc = new DateTimeZone('UTC');
$excelDateValue = PHPExcel_Shared_Date::PHPToExcel(new DateTime('2019-07-07 00:00:00', $tz_utc));
$sheet->setCellValue("A1", $excelDateValue);

PHPToExcelの第2引数と第3引数が使えたらこれでよい?

$excelDateValue = PHPExcel_Shared_Date::PHPToExcel(new DateTime('2019-07-07'), true, 'Asia/Tokyo');
$sheet->setCellValue("A1", $excelDateValue);

メモ

PhpSpreadsheet では、\PhpOffice\PhpSpreadsheet\Shared\Date::PHPToExcel() を使う。

メモ 2

可能なら、書式をユーザー定義で「yyyy/mm/dd」にして読み書きすると、このあたりの悩みが消えるかもしれません。

関連するメモ

コメント