【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を扱う時には採用の検討よちありです。