🗂
Laravel-ExcelでCSVエクスポートを実装する
今回は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