【php】PHPExcelで日付型のセルに日付として値を入れる方法
問題
PHPExcelで既存のExcelを開いて書き込みをする処理を作っています。
書式設定が日付型の列があるのですが、setCellValue(‘2019/07/07’) などすると、文字列で 2019/07/07 が入るようです。
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」にして読み書きすると、このあたりの悩みが消えるかもしれません。
コメント