Laravel ExcelでExcelをインポートしデータベースにデータを取り込みます。
Excelはデータを扱う際によく利用されるツールであり、システムでエクスポートしたデータの形式がExcel形式であることは多々あります。
Laravel ExcelはLaravelフレームワークでExcelを読み書きするためのパッケージで、簡潔なコードで実装できるため便利です。
このLaravel ExcelでUserテーブル(何でも構いませんが分かりやすいので)にExcelのデータを入れる処理を記載していきます。
Laravelは既にインストール済みという前提で進めます。
もしインストールから知りたいという方がいればこちらを参照してください。
Laravel Excelをインストールする
まずはLaravel Excelをインストールします。
composer.jsonのrequire内に下記を記載します。
"maatwebsite/excel": "^3.1"
composer.jsonはLaravelプロジェクトに必要なアプリ・パッケージの情報を記載するファイルです。
プロジェクトのルート配下にあるはずです。
記載できたら下記コマンドを実行しLaravel Excelをインストールします。
composer update
composer.jsonの記述内容をもとに各パッケージをインストール・アップデートできます。
インストールできたらapp.phpで呼び出しのための設定をします。
app.phpはアプリケーションの起動時にサービスやコンポーネントの設定をするための設定ファイルです。
app.phpのProvidersとaliasesの中にそれぞれ1行追加してください。
<?php
return [
'providers' => [
…
Maatwebsite\Excel\ExcelServiceProvider::class,
],
'aliases' => [
…
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
],
];
?>
Providersに記載しておくとアプリケーション起動のタイミングでサービスや機能を自動登録できます。
aliasesでは、facadesとそのfacadesが参照する実際のclassとの対応関係を登録できます。
facadesとは、アプリケーションのサービスコンテナ内にあるclassへの静的なインターフェースを提供するものです。
ここではExcelというfacadesとMaatwebsite\Excel\Facades\Excelというclassの対応関係を登録しています。
Laravel ExcelでExcelをインポートする
前手順でLaravel Excelを利用する準備ができたため、Excelをインポートする簡単な処理を記載してみます。
viewの作成(インポートするファイル選択用のフォーム)
Laravel ExcelでインポートするExcelファイルを取得するフォームを作成します。
resources/views配下にimport.blade.phpファイル(ファイル名は任意)を作成し下記を書き込みます。
<!DOCTYPE html>
<html>
<head></head>
<body>
<form action="{{ asset('get_excel/import')}}" method="post" enctype="multipart/form-data">
<input type="file" name="import_file" accept=".xlsx">
<button class="btn">{{\GeneralConst::IMPORT}}</button>
</form>
</body>
</html>
端的に言えば入力欄とボタンをHTMLのformタグで作成しているだけです。
この辺りはLaravel Excelとは直接的な関わりがないため説明は割愛します。
Laravel特有のところだけ触れておくと、下記はweb.phpの設定に従ってControllerを呼び出します。
{{ asset('get_excel/import')}}
下記は登録した固定値を呼び出しているだけです。
{{\GeneralConst::IMPORT}}
web.phpの記載
web.phpにviewからの呼び出しに答えるための記載をします。
web.phpからGetExcelControllerを扱えるようGetExcelController class を記載します。
use App\Http\Controllers\GetExcelController;
/get_excel/importでGetExcelControllerのImportメソッドを呼び出せるよう1行追加します。
Route::post('/get_excel/import', [GetExcelController::class, 'Import']);
Controllerの作成(viewからのrequest受け取り)
次に任意の名前でControllerファイル(app/http/Controllers配下)を作成します。
上でGetExcelControllerを呼び出す処理を記載したため、ここではGetExcelController.phpとしておきます。
web.phpに記載したController名が別であれば、そのController名を使ってください。
Laravel Excelとインポート処理のカスタマイズ用Controllerを呼び出すため、作成したファイルの先頭行付近に下記を記載します。
use Maatwebsite\Excel\Facades\Excel;
use App\Imports\ExcelImport;
Laravel Excelのimportメソッドで前処理で取得したExcelをインポートします。
web.phpでImportを呼び出すようにしていたためImport functionを作成しその中に処理を記載します。
Public function Import(Request $request){
Excel::import(new ExcelImport, request()->file('import_file'));
}
aliasを設定しているためExcelでLaravel Excelを呼び出しています。
そのExcelの後に::[メソッド名]のように記載しLaravel Excelのimportメソッドを呼び出しています。
念の為記載しておきますが、このimportメソッドはLaravel Excelで提供されるメソッドで、先ほど自身で作成したImport functionとは別物です。
importメソッドの第1引数はインポート処理のカスタマイズ用のController、第2引数にはインポートするファイルを指定します。
ここでは第1引数にExcelImport Controller、第2引数にviewsで作成したフォームで取得したファイルが入るよう記載しています。
Controllerの作成(Excelファイルのインポート処理)
最後にExcelファイルのインポート処理をするControllerとなるExcelImport.phpを作成します。
App/Imports配下にExcelImport.phpを作成したら、Excelファイルから読み込んだデータをEloquentモデルに変換しデータベースに保存するためのToModelインターフェースを利用するため、下記を記載します。
namespace App\Imports;
use App\Models\User
use
Maatwebsite\Excel\Concerns\ToModel;
UserはModelでデータベースに作成したUserテーブルです。
続いてExcelImport classを記載します。
class ExcelImport implements ToModel{}
{}内にExcelデータをUserテーブルに入れる処理を記載します。
public function model(array $row){
return new User([
'name' => $row[0],
'email' => $row[1],
'phone' => $row[2]
]);
}
Userテーブルのname,email,phoneカラムにExcelの1列目,2列目,3列目の値を入れています。
ついでながら、上記でImport Controllerを1から手作業で作りましたが、ターミナルを開き下記を実行することで適切なパスにImport Controllerのテンプレートを自動で作成することができます。
php artisan make:import UsersImport --model=User
以上です。
Laravel Excelを利用してExcelのインポートを試してみてください。


コメント