LaravelでEXCELをExport/ImportするためのLaravel Excelの使用方法について説明を行なっています。本文書を読むとテーブルに保存されているデータをEXCELファイルで保存でき、EXCELファイルに保存したデータを一括でテーブルに保存することができます。

Laravel Excelのインストール

LaravelでEXCELを簡単に操作できるようにするため、composerを利用して、maatwebsite/excelのインストールを行います。


$ composer require maatwebsite/excel

Composerの理解が不足している人は下記がおすすめです。

インストールすると3つのパッケージがインストールされます。


laravel $ composer require maatwebsite/excel
Using version ^3.1 for maatwebsite/excel
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 3 installs, 0 updates, 0 removals
  - Installing markbaker/complex (1.4.7): Downloading (100%)
  - Installing phpoffice/phpspreadsheet (1.5.2): Downloading (100%)
  - Installing maatwebsite/excel (3.1.3): Downloading (100%)

maatwebsite/excelはversion2から3にアップして、マニュアルや操作方法も変更になっているので注意が必要です。

Exportファイルの作成

本文書ではusersテーブルに入ったデータをExportして、Excelファイルの作成を行うので、Userモデル用のExportファイルの作成を行います。


$ php artisan make:export UsersExport --model=User
Export created successfully.

appフォルダの下にExport/UsersExport.phpが作成されます。作成したUsersExport.phpには下記が記述されています。


<?php

namespace App\Exports;

use App\User;
use Maatwebsite\Excel\Concerns\FromCollection;

class UsersExport implements FromCollection
{
    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        return User::all();
    }
}

usersテーブルに入っているデータをExportしたいので、必ずusersテーブルへのデータ挿入を完了させておいてください。

usersテーブルへのテストデータの挿入は下記がおすすめです。

usersテーブルデータのExport

excelファイルのダウンロード

Exportを行うコントローラーの作成を行なってください。ここでは、UsersControllerを使用します。


$ php artisan make:controller UsersController
Controller created successfully.

web.phpファイルに作成したUsersControllerコントローラーのルーティングを追加します。


Route::get('/', function () {
    return view('welcome');
});

Route::get('users','UsersController@export');

UsersControllerコントローラーにexportメソッドを記述します。


<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Maatwebsite\Excel\Facades\Excel;
use Exports\UsersExport;

class UsersController extends Controller
{
    public function export(){

    	 return Excel::download(new UsersExport, 'users.xlsx');

    }
}

ここまでのExport設定が完了したら、ブラウザを使用して、/usersにアクセスします。アクセスするとusers.xlsxファイルがダウンロードフォルダに保存されます。

データベースをsqliteを使用し、php artisan serveを実行した後にsqliteの設定した場合は、SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `users`)エラーが発生します。その場合は、一度php artisan serveを停止し、再度php artisan serveを実行してください。

users.xlsxファイルを開くとUsersテーブルに保存されているすべての行が保存されています。

Laravel Excelを作成したExcelファイル

Laravel Excelを作成したExcelファイル

列名の設定(ヘッダー設定)

ダウンロードしたEXCELファイルには、列名が表示されていませんでした。下記の設定を行い、ヘッダーを表示させます。headingsメソッドだけではなく、WithHeadingsインターフェイスを忘れずに追加してください。


<?php

namespace App\Exports;

use App\User;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class UsersExport implements FromCollection, WithHeadings
{
    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        return User::all();
    }

    public function headings(): array
    {
        return [
            '#',
            'name',
            'email',
            'email_verified_at',
            'created_at',
            'updated_at'
        ];
    }    
}

ダウンロードしたファイルを開くと設定した列名が表示されます。

Export Excelの列名の表示

Export Excelの列名の表示

サーバ上に保存する(ディスク保存)

アップロードしたファイルの保存方法について確認します。ダウンロードする際は、downloadメソッドを利用しましたが、ディスクに保存する場合は、storeメソッドを利用します。保存される場所は、Laravelインストールディレクトリのstorage/appの下に保存されます。


Excel::store(new UsersExport, 'users.xlsx');

storage/appディレクトリの下にあるpublicに保存する場合は、下記のように変更することで行うことができます。


Excel::store(new UsersExport, 'public/users.xlsx');

Importファイルの作成

本文書ではusersテーブルにデータをImportするためUserモデル用のImportファイルの作成を行います。


$ php artisan make:import UsersImport --model=User
Import created successfully.

appフォルダの下にImport/UsersImport.phpが作成されます。作成したUsersImport.phpには、アップロードするEXCELファイルの列がインポートするテーブルのどの列に対応するのかを記述していきます。


<?php

namespace App\Imports;

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

class UsersImport implements ToModel
{
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row)
    {
        return new User([
        ]);
    }
}

UsersImportを更新する前にImportするファイルの情報を確認する必要があります。ImportするEXCELファイルには、2行のユーザ情報が含まれています。A列(0列)にはname, B列(1列)にはemail, C列(2列)にはpasswordの情報が入っています。

Importを行うEXCELファイル

Importを行うEXCELファイル

この列情報を元にUsersImport.phpを更新します。usersテーブルnameには0列、emailには1列、passwordは暗号化を行うので、Hashを使って列2を暗号化しています。


public function model(array $row)
{
   return new User([
       'name'     => $row[0],
       'email'    => $row[1], 
       'password' => Hash::make($row[2]),
   ]);
}

usersテーブルへのImport

web.phpにusersテーブルへのImportに必要なルーティングを追加します。


Route::resource('/users','UsersController');

UsersControllerのではファイルをアップロードするフォームを表示するindexメソッドとアップロードしたファイルをImportするstoreメソッドを記述しています。


<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Maatwebsite\Excel\Facades\Excel;
use App\Imports\UsersImport;

class UsersController extends Controller
{

    public function index(){

    	return view('index');

    }

    public function store(Request $request){

		$file = $request->file('file');

		Excel::import(new UsersImport, $file);

    }
}

/usersにブラウザからアクセスするとファイルをアップロードするため画面が表示されます。

Importファイルアップデート画面

Importファイルアップデート画面

ファイルには下記の内容が記述されたEXCELファイルをアップロードします。

Importを行うEXCELファイル

Importを行うEXCELファイル

実行後、php artisan tinker等を使用して、usersテーブルの行の情報を確認するとImportした2行の情報が追加されていることを確認することができます。


       App\User {#2966
         id: "11",
         name: "John Dow",
         email: "john.dow@example.com",
         email_verified_at: null,
         created_at: "2018-12-31 12:13:38",
         updated_at: "2018-12-31 12:13:38",
       },
       App\User {#2967
         id: "12",
         name: "Bill Gate",
         email: "bill.gate@example.com",
         email_verified_at: null,
         created_at: "2018-12-31 12:13:39",
         updated_at: "2018-12-31 12:13:39",
       },

Export, Importの日本語について

ImportするEXCELファイルに日本語を使用しても文字化けなしでImportすることができます。また、日本語で登録した情報をEXCELファイルでダウンロードすると文字化けなしで行うことができます。