Laravelでエクセル機能を使うには、maatwebsiteが超おすすめ。
エクセルのインポート・エクスポートがとても手軽にできます。
今回はインストール方法とインストール方法、そしてバリデーションの付け方を解説していきますね。

続編記事ではエクスポート方法を解説します。
maatwebsite のインストール・設定
まずはインストールから進めていきましょう。
今回テストで使った環境はLaravel8ですが、Laravel6でも動作確認済みです。
① maatwebsite/excelをインストール
下記コマンドでパッケージをインストールします。
| 1 | composer require maatwebsite/excel | 
② configファイルに記述
app/configの中のapp.phpを開き、Providersの項目に下記を入力。
| 1 | Maatwebsite\Excel\ExcelServiceProvider::class, | 
さらにAliasの項目に下記を入れてください。
| 1 | 'Excel'=>Maatwebsite\Excel\Facades\Excel::class, | 
③ 設定ファイルを作成
maatwebsite/excel用の設定ファイルを作成します。
| 1 | php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" | 
app/configの中にexcel.phpファイルが出来ています。
ほぼデフォルトのままでOKですが、日本語のヘッダを利用したい場合は、111行目の ‘heading_row’の ‘formatter’ を ‘none’ にしておきましょう。
【変更前】
| 1 2 3 |         'heading_row' => [             'formatter' => 'slug',         ], | 
【変更後】
| 1 2 3 |         'heading_row' => [             'formatter' => 'none',         ], | 
以上でインストール完了です。
Excelファイルのインポート
それではまずは、Excelファイルをインポートしてみましょう。
下記のようなファイルをインポートするとします。

それでは、まずはインポートした情報を格納するデータベースから作っていきましょう。
① データベースの作成
下記コマンドで、モデルとマイグレーションファイルを作成します。
| 1 | php artisan make:model Dango -m | 
app/Modelsの中にDango.phpモデルファイルができます。
データベーステーブルに値を入れられるよう、ファイルの中に、次の1行を加えます。
| 1 |     protected $guarded = ['id']; | 
またdatabase/migrations の中にできるマイグレーションファイルには、次のように入力しておきましょう。
| 1 2 3 4 5 6 7 8 9 10 |     public function up()     {         Schema::create('dangos', function (Blueprint $table) {             $table->id();             $table->string('dango');             $table->integer('number');             $table->string('date');             $table->timestamps();         });     } | 
マイグレーションを実行します。
| 1 | php artisan migrate | 
データベースにお団子テーブルができました。

② ルート設定
表示用のルート設定と、読み込み用のルート設定を作っておきます。
| 1 2 | Route::get('/dango', 'DangoController@dango')->name('dango'); Route::post('/import', 'DangoController@import')->name('import'); | 
③ ビューファイルの作成
resources/viewsの中にdango.blade.php を作成します。
次のように入れておきます。
| 1 2 3 4 5 6 7 8 | <form action="{{ route('import') }}" method="POST" enctype="multipart/form-data"> 	@csrf 	<div class="form-group"> 		<input type="file" name="file"> 		<br><br> 		<button class="btn btn-success">ボタンをクリック</button> 	</div> </form> | 
④ インポート設定ファイルの作成
次に下記コマンドでインポート用のファイルを作成します。
| 1 | php artisan make:import DangoImport --model=Dango | 
app/Imports に DangoImport.phpファイルが作成されます。
⑤ ヘッダ用の設定
・DangoImport.phpを開き、先頭に下記のuse宣言を加えておきます。
class名のあとにも【WithHeadingRow】と加えておきましょう。
| 1 | use Maatwebsite\Excel\Concerns\WithHeadingRow; | 
・また一番上のモデル名は、Laravel7までの書き方になっています。
Laravel8~ご利用の場合は、app\Models\モデル名 と変更してくださいね。
・さらにmodelメソッドの中を次のルールで編集していきます。
{
return new モデル名([
‘データベースのカラム名‘=> $row[‘エクセルのカラム名‘],
]);
}
| 1 2 3 4 5 6 7 8 |     public function model(array $row)     {         return new Dango([             'dango'=>$row['お団子の種類'],             'number'=>$row['数'],             'date'=>$row['購入日']         ]);     } | 
編集後のファイルは下記のとおり。黄色で囲んだ部分が追加した箇所です。


なおヘッダは入れない場合には、WithHeadingRowは不要です。
$row[0] など、カラムの番号を入れてください。
④ コントローラーの設定
最後にコントローラーの設定です。
下記コマンドで団子用コントローラーを作成。
| 1 | php artisan make:controller DangoController | 
app\Controllersの中にDangoController.phpファイルが出来ます。
DangoController.phpファイルを開き、一番上に、下記のuse宣言を入れておきましょう。
| 1 2 | use App\Imports\DangoImport; use Maatwebsite\Excel\Facades\Excel; | 
表示用とインポート用のメソッドを追加します。
ページ表示用はこちら。
| 1 2 3 |     public function dango(){         return view('dango');     } | 
インポート用はこちら。
| 1 2 3 4 |     public function import(){         Excel::import(new DangoImport, request()->file('file'));         return back();     } | 
⑤ テスト
以上で準備完了。テストしてみましょう。
サーバーを起動し、/dangoを開くと、下記の画面が表示されます。

【ファイルを選択】でローカル上からエクセルファイルを選択し、【ボタンをクリック】
無事にインポートできれば、データベーステーブルの中にデータが入っています。
Excelファイルインポート前にバリデーションを入れる
エクセルファイルのインポートの際、バリデーションを加えることも可能です。
① バリデーションルールの追加
app/Importsの中のDangoImport.phpを開きます。
一番上に次のuse宣言を加えてください。
| 1 | use Maatwebsite\Excel\Concerns\WithValidation; | 
class名のあとにも、WithValidation を追加します。
rulesメソッドにバリデーションルールを入れていきます。
書き方は次のとおり。
{
return [
‘データベースのカラム名‘ => ‘バリデーションルール‘,
];
}
たとえば、dateカラムの入力を必須にするのであれば次のように入れます。
| 1 2 3 4 5 6 |     public function rules(): array     {         return [             'date' => 'required',         ];     } | 
オリジナルのエラーメッセージを表示したい場合は、バリデーションルールの下に、customValidationMessagesメソッドを追加します。
| 1 2 3 4 5 6 |     public function customValidationMessages()    {     return [         'date.required' => '購入日がありません',     ];    } | 
インポートファイルは次のようになります。

② エラー表示箇所の追加
またresources/viewsの中のdango.blade.phpファイルにエラーメッセージが表示される場所を作っておきます。
| 1 2 3 4 5 6 7 8 9 | @if ($errors->any()) <div class="alert alert-danger"> 	<ul> 		@foreach ($errors->all() as $error) 			<li>{{ $error }}</li> 		@endforeach 	</ul> </div> @endif | 
これで、バリデーションにひっかかった場合にはエラーメッセージが出てきます。

さいごに

セルをクリックして、上部に正しいデータが表示されていれば大丈夫です。

後半はエクスポート方法を解説しています。
また重複防止や日時エラー対策など、関連記事に色々掲載しております。
困ったときには、併せて参考にしてみてください。
 
  
  
  
  


