maatwebsiteを使って日付が入ったExcelをインポートする際、エラーになることがあります
エラーを解決するには、Carbonを使って、Excelの日時フォーマットを変更しましょう。
たとえば、次のようなエクセルファイルをインポートするとします。
日付部分は、セルの書式設定 で日付に変換してあります。
【インポートするエクセルファイル】
「販売日」のデータ型は、dateに設定してあります。
このような場合、このInvalid datetime formatエラーが発生します。
エラーを避けるには、次のように、インポートファイルの日付部分をCarbonを使って変更します。
【DangoImportファイルの設定】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace App\Imports; use App\Models\Dango; use Maatwebsite\Excel\Row; use Maatwebsite\Excel\Concerns\OnEachRow; use Maatwebsite\Excel\Concerns\WithHeadingRow; use Carbon\Carbon; class DangoImport implements OnEachRow, WithHeadingRow { public function OnRow(Row $row) { $row=$row->toArray(); $dango=Dango::firstOrCreate( [ 'dango'=>$row['お団子の種類']], [ 'dango'=>$row['お団子の種類'], 'number'=>$row['数'], 'date'=>Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['販売日'])) ] ); } } |
なおコントローラーは、通常どおりの書き方です。
【DangoImportファイルのためのコントローラー】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php namespace App\Http\Controllers; use App\Imports\DangoImport; use Maatwebsite\Excel\Facades\Excel; use Illuminate\Http\Request; use App\Models\Dango; class DangoController extends Controller { public function import(){ $import=new DangoImport; Excel::import($import, request()->file('file')); return view('dango'); } } |
インポートファイルでの書き方のポイントを解説していきます。
Excel Invalid datetime formatエラー対策 ポイント解説
もしCarbonは日時を扱う際に便利なライブラリですが、もしまだインストールしていない場合には、最初にインストールをします。
1 |
composer require nesbot/carbon |
Importファイルの先頭に、Carbonのuse宣言を加えます。
1 |
use Carbon\Carbon; |
日付部分のカラムのインポートを指定する部分で、Carbonを使って、フォーマットを変更します。
1 |
'date'=>Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['販売日'])) |
これで、次のような形でインポートできます。
【インポート後のデータベーステーブル】
じゅんこ
無事エラーが解決したら嬉しいです。
さいごに
なおmaatwebsiteを使ってExcelをインポートする方法・重複エラー対策・日付空欄時対策など、関連記事で色々と取り上げております。
Excelのインポートは、色々と思いがけないエラーが起こりますよね。
困ったときに、参考にしてみてください。