Laravel9でExcelファイルをインポート/エクスポートする方法【maatwebsite】

Laravelでエクセルをインポート・エクスポートする方法を知りたい、できれば簡単に。という方に向けた記事になります。

開発業務の中でエクセルを使う機会があったので、インポートとエクスポートの方法を勉強したのでメモ。

環境

PHP 8.0.8
・Laravel 9.14.0
・Docker 20.10.17

maatwebsiteとは

出典:https://docs.laravel-excel.com/3.1/getting-started/

Laravelで簡単にexcelを操作するためのライブラリ。

このライブラリの機能のひとつにインポート、エクスポート機能があります。

公式サイト
https://docs.laravel-excel.com/3.1/getting-started/

maatwebsiteのインストール・設定

1.maatwebsite/excelをインストール

以下の記事に詳しくまとめました。

2.configファイルに記述

ディレクトリ app/configのapp.phpに以下の内容を追記。

Maatwebsite\Excel\ExcelServiceProvider::class,

次に、Aliasの項目に以下の内容を追記してください。

'Excel'=>Maatwebsite\Excel\Facades\Excel::class,

3.設定ファイルの作成

以下のコマンドを実行し、excel用の設定ファイルを作成します。

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"

app/configにexcel.phpが作成されています。

Excelファイルのインポート

実際に以下のExcelファイルをインポートしてみます。

生年月日等はご自身で変えてください。

1.データベースの作成

まずは以下のコマンドでモデルとマイグレーションを作成します。

php artisan make:model ExcelData -m

次にdatabase/migrationsの中に作成されたマイグレーションファイルに以下の内容を追記します。

Schema::create('excel_data', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->integer('age');
            $table->date('birthday');
            $table->timestamps();
        });

以下のコマンドでマイグレーションを実行。

php artisan migrate

データベースにテーブルが作成されているか確認。

2.ルート設定

表示用・インポート用・エクスポート用のルーティングをweb.phpに記載。(エクスポートは記事後半で解説しています。)

//エクセル用のルーティング
Route::get('/excel', 'App\Http\Controllers\ExcelController@excel')->name('excel');
Route::get('/excelExport', 'App\Http\Controllers\ExcelController@excelExport')->name('export');
Route::post('/excelImport',  'App\Http\Controllers\ExcelController@excelImport')->name('import');

3.ビューファイルの作成

resources/viewsの中にexcel.blade.php を作成します。

<form action="{{ route('import') }}" method="POST" enctype="multipart/form-data">
	@csrf
	<div class="form-group">
		<input type="file" name="file">
		<br><br>
		<button class="btn btn-success">Excelインポート</button>
        @if (session('importMessage'))
        <div class="alert alert-success text-center">
            {{ session('importMessage') }}
        </div> 
        @endif
	</div>
</form>

セッションでエラーメッセージを表示できるようにしています。不要であれば削除してください。

4.インポートファイルの作成

以下コマンドでインポートファイルを作成します。

php artisan make:import ExcelImport --model=ExcelData

app/Imports にExcelImport.phpファイルが作成されます。

5.ヘッダーの設定

ヘッダーを含める場合、ExcelImport.phpの先頭に以下を追加。

use Maatwebsite\Excel\Concerns\WithHeadingRow;

クラス名の最後にも追加しましょう。

class ExcelImport implements ToModel,WithHeadingRow

さらに、ExcelImport.phpのmodelメソッドに以下を追加。

    public function model(array $row)
{
return new モデル名([
‘データベースのカラム名‘=> $row[‘エクセルのカラム名‘],
]);
}

今回は、以下のようになります。

public function model(array $row)
    {
        return new ExcelData([
            //
            'name'=>$row['名前'],
            'age'=>$row['年齢'],
            'birthday'=>$row['生年月日']
        ]);
    }

6.コントローラーの設定

コントローラー用に以下のコマンドを実行。

php artisan make:controller ExcelController

app\ControllersにExcelControllerが作成されます。

そして、ExcelController.phpの先頭に以下を追加。

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

最後に表示用・インポート用のメソッドを追加します。

//ページ表示用
    public function excel(){
        return view('excel');
    }
//ページインポート用
    public function excelImport(){

        //ファイルが選択されていない場合
        if(request()->file('file') == false){
            return back()->with('importMessage', 'ファイルを選択してください');
        }

        Excel::import(new ExcelImport, request()->file('file'));
        return back()->with('importMessage', 'インポートが完了しました。');
    }

Excelをインポートしてみよう

以上で準備は完了です。/excelにアクセスすると以下の画面が表示されるはずです。

※エクスポートボタンは今は気にしないでください。

無事にインポートが完了すれば、データベースにエクセルのデータが入っています。

Excelファイルのエクスポート

インポート時に作成した「ExcelData」テーブルを使ってDBに登録されているデータをエクスポートする機能を解説します。

エクスポートファイルの作成

以下コマンドでインポートファイルを作成します。

php artisan make:import ExcelExport --model=ExcelData

app/Imports にExcelExport.phpファイルが作成されます。

ルート設定を追加

インポート時に設定したルーティングのままでOKです。

//エクセル用のルーティング
Route::get('/excel', 'App\Http\Controllers\ExcelController@excel')->name('excel');
Route::get('/excelExport', 'App\Http\Controllers\ExcelController@excelExport')->name('export');
Route::post('/excelImport',  'App\Http\Controllers\ExcelController@excelImport')->name('import');

ビューファイルを編集

resources/viewsの中にexcel.blade.php に以下のコードw追記します。

<a href="{{ route('export') }}">		
    <button class="btn btn-success">Excelエクスポート</button>    
</a>
@if (session('exportMessage'))
    <div class="alert alert-success text-center">
        {{ session('exportMessage') }}
    </div> 
@endif

コントローラーの編集

app/Httpsの中のExcelController.phpの先頭に以下を追加。

use App\Exports\ExcelExport;
use Maatwebsite\Excel\Facades\Excel;

最後に表示用・エクスポート用のメソッドを追加します。

//ページエクスポート用
    public function excelExport(){
        $date = date('Y-m-d H:i:s');
        return Excel::download(new ExcelExport,"$date.xlsx");
    }

これで準備O K。

エクセルをエクスポートしてみよう

上記の通り実行すれば、以下のようにダウンロードできるはずです。

Excelファイルのエクスポート時に不要なカラムを削除

このままだとIDやTIMESTAMPSのカラムもエクスポートされるので、app/Exportsの中のExcelExport.phpファイルのcollectionメソッドにmakehiddenを追加しましょう。

    public function collection()
    {        
        return ExcelDatas::all()->makeHidden(['id', 'created_at', 'updated_at']); 
    }

makeHiddenメソッドは、指定したカラム名を排除することができます。

Excelファイルのエクスポート時にヘッダーをつける

できればヘッダーも付けたい方は、app/Exportsの中のExcelExport.phpファイルを開き、次のuse宣言を追記しましょう。

use Maatwebsite\Excel\Concerns\WithHeadings;

Class名の末尾にも、WithHeadingsを追加します。

これでヘッダー付き、不要カラムが削除されたエクセルをエクスポートができるようになりました。

この記事を書いた人

アイティーエス株式会社

群馬県前橋市にあるアイティーエスは、アプリケーションの開発に核を置きながら、安定したネットワークの構築、業務コンサルティングから業務分析、設計、運用管理までの一貫したビジネスモデルを確立いたします。お問い合わせはこちら