maatwebsiteを使って日付が入ったExcelをインポートする際、エラーになることがあります
エラーを解決するには、Carbonを使って、Excelの日時フォーマットを変更しましょう。
たとえば、次のようなエクセルファイルをインポートするとします。
日付部分は、セルの書式設定 で日付に変換してあります。
【インポートするエクセルファイル】

「販売日」のデータ型は、dateに設定してあります。
このような場合、このInvalid datetime formatエラーが発生します。
エラーを避けるには、次のように、インポートファイルの日付部分をCarbonを使って変更します。
【DangoImportファイルの設定】
<?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ファイルのためのコントローラー】
<?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は日時を扱う際に便利なライブラリですが、もしまだインストールしていない場合には、最初にインストールをします。
composer require nesbot/carbon
Importファイルの先頭に、Carbonのuse宣言を加えます。
use Carbon\Carbon;
日付部分のカラムのインポートを指定する部分で、Carbonを使って、フォーマットを変更します。
'date'=>Carbon::instance(\PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($row['販売日']))
これで、次のような形でインポートできます。
【インポート後のデータベーステーブル】


じゅんこ
無事エラーが解決したら嬉しいです。
さいごに
なおmaatwebsiteを使ってExcelをインポートする方法・重複エラー対策・日付空欄時対策など、関連記事で色々と取り上げております。
Excelのインポートは、色々と思いがけないエラーが起こりますよね。
困ったときに、参考にしてみてください。



コメント