LaravelとFast ExcelでCSVエクスポートする
LaravelでCSVをエクスポートする際、Fast-Excelを使うと簡単にエクスポートできます。
また、出力件数が多い場合でも、ちょっとした工夫でメモリ使用量を抑えることができます。
Fast-ExcelのREADMEに書いてある通りですが、サンプルのリポジトリも公開してあるので合わせて確認いただければと思います。
Fast-Excelのインストール
Composerコマンドでインストールするだけです。
composer require rap2hpoutre/fast-excel
CSVダウンロード
次のソースはサンプルリポジトリの「app/Http/Controllers/Controller.php」から抜粋したソースです。
「downloadCsv」により「SampleItem」モデルを通じて「sample_items」テーブルから取得したデータがCSVエクスポートされます。
function sampleItemsGenerator()
{
/*
出力対象のモデル、条件などを指定します
cursor()とyieldによりメモリ使用量を抑えます
*/
foreach (SampleItem::where('price', '>', 10000)->orderBy('id')->cursor() as $entry) {
yield [
'名前' => $entry->name,
'UUID' => $entry->uuid,
'概要文' => $entry->description,
'カラー' => $entry->color,
'価格' => $entry->price,
];
}
}
function downloadCsv()
{
return (new FastExcel($this->sampleItemsGenerator()))->download('sample.csv');
}
Fast-ExcelのREADMEに記載がありますが、メモリ使用量を抑えるために「sampleItemsGenerator」のforeachでは「cursor()」を使用しています。
「cursor()」ではなく「get()」でも動作しますが、出力件数に応じてメモリ使用量が大幅に増えてしまいます。
なお、Laravelの公式ドキュメントに記載の通り、「cursor()」でもPDOドライバなどがキャッシュしてしまうため、出力件数に比例してメモリ使用量は多くなります。
サンプルリポジトリについて
実際に触って確かめたい方はサンプルリポジトリのソースをご確認いただくか、README.mdに記載の手順にてセットアップしてご確認いただけます。
READMEの手順でセットアップする際はDockerが必要なので、予めDocker Desktopなどのインストールをお願いします。
なお、サンプルリポジトリにはテストデータ作成用のSeederも用意してあるので確認しやすいと思います。
まとめ
Fast-Excelを使ってCSVファイルをエクスポートする方法についてご紹介しました。
Fast-Excelはシンプルで軽量なCSVエクスポートが可能ですが、その名の通り、Excelファイルを扱うことも可能です。
シンプルな反面、機能が少なめなので、Excelファイルを扱う際はLaravel Excelも合わせて検討したほうが良いと思います。