🗂

Laravel-ExcelでCSVエクスポートを実装する

2021/11/08に公開

今回はLaravel-Excelを用いてCSVエクスポート機能を実装するということで、
シンプルに、データベースのとあるテーブルのデータを全てエクスポートするという機能を実装していきます。

個人的には、FromCollection, WithHeadings, WithMappingを使用すると、結構何でも応用できるCSVエクスポート機能が実装できるかなと思います。

エクスポートのコードを作成する

雛形をとってきて、

php artisan make:export UserExport

コードを作成していきます。

こちらが、僕が作成したサンプルコードです。

<?php

namespace App\Exports;

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

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

    public function headings(): array
    {
        return  ["id", "name", "age", "gender"];
    }

    public function map($row): array
    {
        return [
	    $row->id,
	    $row->name,
	    $row->age,
	    $row->gender
	];
    }
}

このようにすると、usersテーブルの「id」「name」「age」「gender」カラムがCSVエクスポートできるコードが作成できました。

ちなみに余談ですが、DBからテーブルの全てのカラムを取得してくることができるので、
usersテーブルの全てのデータをエクスポートしたい場合はこのようにロジックを組むことができます。

<?php

namespace App\Exports;

use App\Models\User;
use Illuminate\Support\Facades\Schema;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;

class UserExport implements FromCollection, WithHeadings, WithMapping
{
    private $table = "users";
    private $columns;
    
    public function __construct()
    {
        $this->columns = Schema::getColumnListing($this->table);
    }

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

    public function headings(): array
    {
        return  $this->columns;
    }

    public function map($row): array
    {
        $array = [];
        $columns = $this->columns;

        foreach ($columns as $column) {
            $array[] = $row->{$column};
        }
        return $array;
    }
}

これでLaravel-Excelを用いて、CSVエクスポートすることができます。

mapメソッドを実装しないと、例えばアクセサなどで指定した追加のプロパティもcsvの項目にダウンロードされてしまいます。

※ちなみにmapメソッドは一行ごとに実行されるため、ここにDBアクセス的な処理を書くと、DBアクセス量がえげつなく多くなり処理が重くなったりメモリエラーを引き起こす可能性が劇的に高くなります。

例えばエクスポートしたファイルをローカルに保存したい場合は、storeを使用します。

return Excel::store(new UserExport(), 'users.csv');

これでテーブルの情報をCSVダウンロードすることができます!
一回テンプレートというかサンプルを作ったら次回以降CSVエクスポート楽勝ですね!

Discussion