Laravel ExcelでExcelをインポートする

プログラミング言語

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のインポートを試してみてください。

コメント

タイトルとURLをコピーしました