[Laravel]超簡単にExcelファイルを取り込む

PHP

大量データの投入にはかなりの労力を伴いますよね
特にテスト用のデータとか、同じようなデータを繰り返し入力するのは地獄です
Excelでパッと作成して、パッと取り込みたい!

LaravelでExcelの取り込みをやるにはどうやるかを書きます

今回使用するのは Laravel-Excelというものです
https://laravel-excel.com/

DB接続に関する情報はここでは記載していません。予め .env を設定して下さいね。

それでは、順を追って説明していきます。

Laravel Excelをインストール

composerでインストールできるように
composer.json 内の require へ「”maatwebsite/excel”: “^3.1” 」を追加します。

[
  "name": "laravel/laravel",
  "type": "project",
  "require": {
    "php": "^7.1.3",
    "fideloper/proxy": "^4.0",
    "laravel/framework": "5.7.*",
    "laravel/tinker": "^1.0",
    "maatwebsite/excel": "^3.1"
  },
]

コマンドプロンプトでプロジェクトフォルダまで移動したら
[ composer update ]を実行します。これでインストールはクリアです。

Laravel Excelの有効化

次に、app.phpを編集します。
app.phpへの記載順序は特に気にしなくても良さそうですが、
一番下に追記しましょう。
providers , aliases に対して、下記2行を追加します。

<?php
return [
  'providers' => [
    …
    Maatwebsite\Excel\ExcelServiceProvider::class,
  ],
  'aliases' => [
    …
    'Excel' => Maatwebsite\Excel\Facades\Excel::class,
  ],
];
?>

これでLaravel Excelが Facadesとして使えるようになりました。
次はExcelデータを取り込む為のModelを作成します。

Model作成

artisanコマンドでモデルを生成してしまいましょう。

> php artisan make:import UsersImport --model=User

作成されたapp\Imports\UsersImport.phpを編集します。
今回は、Laravelで自動生成できるusersテーブルを使ってみます。

そもそものテーブルはmigrationを実行して作成しておいて下さいね。

<?php
namespace App\Imports;

use App\User;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithHeadingRow;

class UsersImport implements ToModel, WithHeadingRow
{
  public function model(array $row)
  {
    return new User([
      'id'=>$row['id'],
      'name'=>$row['name'],
      'email'=>$row['email'],
      'email_verified_at'=>$row['email_verified_at'],
      'password'=>$row['password'],
      'remember_token'=>$row['remember_token'],
      'created_at'=>$row['created_at'],
      'updated_at'=>$row['updated_at'],
    ]);
  }

  public function headingRow() : int
  {
    return 1;
  }
}
?>

$rowの役割

$rowは文字通り、行データを格納する変数です。
この$rowで保持している各列のデータを、Userモデルの各プロパティにマッピングさせます。

マッピング方法は$row[‘id’]のようにカギカッコの中の文字列で指定します。
このカギカッコ内の文字列はインポートデータのヘッダ行の定義と一致します。

インポートするファイルは下表のような形です。

idnameemailemail_verified_atpassword
1tarotaro@test.comnull********
2hanahana@test.comnull*******

ヘッダ行の認識

WithHeadingRowによって、ヘッダを認識することができるようになります。
これを使わなければ、ヘッダも通常レコードとしてインポートされるようになります。

headingRowという関数によって、取り込むファイルのヘッダ行がどこにあるかを定義できます。取り込むファイルのヘッダ行が2行目にあれば、return 2;とすればOKです。

Controllerを準備

先程作成したModelをControllerで使用します。Controllerでは画面からPostされたファイル情報をModelに引き渡すような実装になります。

<?php
namespace App\Http\Controller;

use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;

class TestController extends Controller
{
  function postData(Request $request)
  {
    Excel::Import(new UsersImport, $request->updateFile);
    return view('next');
  }
}
?>

HTMLを準備

準備はあと少しです。インポート対象をPostするだけです。ファイルをアップロードする為のタグをform内に設けます。

<form action="next" method="post" enctype="multipart/form-data">
  <input type="file" name="uploadFile">
  <button>Submit</button>
</form>

ここでポイントとなるのはformタグの属性としてenctypeを指定する点です。これを忘れていると、Controller側でアップロードしたファイルの名前しか取得できません。

最後に

如何でしたでしょうか。
今回はポイントをかいつまんで説明しましたが、簡単にエクセルのデータを直接DBに書き込む事ができたと思います。Javaでこれをやると結構時間と手間がかかるイメージですが、Laravel Excelだと慣れればあっという間に実装できますね。

公式サイト:https://laravel-excel.maatwebsite.nl/