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 |
これで、バリデーションにひっかかった場合にはエラーメッセージが出てきます。
さいごに
セルをクリックして、上部に正しいデータが表示されていれば大丈夫です。
後半はエクスポート方法を解説しています。
また重複防止や日時エラー対策など、関連記事に色々掲載しております。
困ったときには、併せて参考にしてみてください。