【laravel】CSVのインポート

未分類


laravelでCSVデータを登録するには、便利なパッケージがあります。

  • laravel-excel
  • fast-execel
  • Goodby CSV

がメジャーなのですが、CSVをインポートがどれが適応できるか調べた所、全て対応してる様子

パッケージを使わなくてもそこそこlaravelで簡単に実装できそうでしたが、今回はcsvだけでなくexcelのインポートもさせてほしいと言う事でしたので

laravel-excelで実装してみます。

まずは「 laravel-excel 」パッケージのインストール

composer require maatwebsite/excel

と思ったのですが、こちらエラーが沢山出てインストールできませんでした。

開発をdockerで行っているのですがどうやらgdが足りない様子でしたのでDockerfileに下記を追加してインストールします。

まずGDが不足していたのでGDをインストールします。

# for gd
RUN apt-get update -y && apt-get install -y libwebp-dev libjpeg62-turbo-dev libpng-dev libxpm-dev \
    libfreetype6-dev

RUN docker-php-ext-install gd

その後「phpoffice/phpspreadsheet」が必要なのでインストールします。


docker-compose exec app bash -c "COMPOSER_MEMORY_LIMIT=-1 composer require phpoffice/phpspreadsheet"
docker-compose exec app bash -c "COMPOSER_MEMORY_LIMIT=-1 composer require maatwebsite/excel:3.*"

初期設定

app/configの中のapp.phpを開き、Providersの項目に下記を設定

Maatwebsite\Excel\ExcelServiceProvider::class,

aliasも設定する。

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

設定ファイルを作成する。

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

次にエクスポート用のクラスとインポート用のクラスを作成します。

php artisan make:export クラス名 --model=App\\モデル名
php artisan make:import クラス名 --model=App\\モデル名

あとはproviderに登録しておいたのでfacedeのExecelからimport関数を呼び出し、エクセルファイルを読み込む

        $excel_file = $request->csv[0];
        Excel::import(new クラス名, $excel_file);

マスターの取り込みの場合

その他、CSVのインポートとしてSeederでマスターの取り込みにも使用します。

例としては、住所マスターや銀行コードマスターを軽量なGoodby CSVを使って、Seeder上で取り込みをして、取り込んだデータを使ってシーディングする等があります。
Goody CSVはメモリの効率が良いみたいなので、大量のCSVを扱う時には採用の検討よちありです。