富山のシステム開発・Web制作会社

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も合わせて検討したほうが良いと思います。

この記事を書いた人
Chief Technology Officer

よく読まれている記事

アクセス数バク上がり方法を大公開!MARBLEのアクセス数を大公開!

Flutter SDKのバージョンをプロジェクト別に指定する

メタバースとWEB3.0について

Laravel TelescopeとTelescope Toolbarで効率よくデバッグする

Safariでclamp()が効かない場合の対処法

【サンプルあり】今すぐ使える!便利な比較関数 min() max() clamp() のお話

CSS 子要素を親要素からはみ出して画面いっぱいに表示させる方法とWindowsブラウザの注意点

Homebrewについて

ディセントラライズド(decentralized)とは

メタバースとは

関連記事

アクセス数バク上がり方法を大公開!MARBLEのアクセス数を大公開!

Flutter SDKのバージョンをプロジェクト別に指定する

Homebrewについて