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

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

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

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


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

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

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

さいごに

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

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




コメント