Laravel Excelの紹介2 インポートに関して

以前紹介した、Laravel Excelの紹介(Laravel:Excelファイル入出力ライブラリ)では、

Excelファイルのエクスポートを中心に書きましたが、今回はインポートの基本操作について紹介したいと思います。ユーザー情報一覧のエクセルを読み込んで User をインポートする例を扱います。

インポート用のクラスの準備

次のコマンドで app/Imports 内にインポートファイルを作成することができます。

php artisan make:import UsersImport --model=User

次のように ToModel から実装したインポート用のクラスを作成します。 model 関数内ではExcelファイルのどの列が User 情報の何に当たるかを定義してます。例では1列目に名前, 2列目にメールアドレス, 3列目にパスワードが書いてあるExcelファイルを読み込んで User データを保存するように記述しています。

<?php

namespace App\Imports;

use App\User;
use Illuminate\Support\Facades\Hash;
use Maatwebsite\Excel\Concerns\ToModel;

class UsersImport implements ToModel
{
    /**
     * @param array $row
     *
     * @return User|null
     */
    public function model(array $row)
    {
        return new User([
           'name'     => $row[0],
           'email'    => $row[1],
           'password' => Hash::make($row[2]),
        ]);
    }
}

次にエクセルファイルの読み込み場所による違いについて説明します。

読み込み先ごとのインポート方法

デフォルトのディスクからインポート

config/filesystems.php で定義されたデフォルトのディスクからインポートする場合は、 import 関数を使って次のように記述します。1番目の引数に先程定義したインポートのためのクラスを、2番目の引数にデフォルトのディスク上にあるファイル名を指定します。

Excel::import(new UsersImport, 'users.xlsx');

その他のディスクからインポート

デフォルト以外のディスクからインポートする場合は3番目の引数で指定します。次の例ではAmazon S3上のファイルをインポートするように記述しています。(S3の設定は config/filesystems.php にて行う必要があります。)

Excel::import(new UsersImport, 'users.xlsx', 's3');

ファイルのフルパスからインポート

config/filesystems.phpの定義を使わずに次のように2番めの引数に直接パスを指定してインポートすることも可能です。

Excel::import(new UsersImport, storage_path('users.xlsx'));

アップロードされたファイルからインポート

先程までは既にディスク上のどこかに保存されたファイルからのインポートでしたが、フォーム等からアップロードされたファイルから直接インポートする場合は2番目の引数を次のようにします。

Excel::import(new UsersImport, request()->file('your_file'));

読み込んだデータをarrayやcollectionで扱う

コントローラ内で読み込んだデータをarrayやcollectionで扱いたい場合があると思います。そんなときは toArray , toColletion 関数を使うことができます。

$array = Excel::toArray(new UsersImport, 'users.xlsx');

$collection = Excel::toCollection(new UsersImport, 'users.xlsx');