九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さて、いつも開発でお世話になってるLaravelですが、このLaravel開発でエクセルを扱うときの定番パッケージ「Laravel Excel」がメジャーアップデートされ、バージョン3.0になりました。
これからの開発できっと必要となってくるはずなので、今回はこの最新版Laravel Excelの新機能をを体験してみることにしました。
【実行環境】
Laravel 5.6
PHP 7.2
【前提】
Modelとして、Item.phpが作成済みで、DBテーブルitemsにデータがある。
どこが変更になった?
今回のアップデートでは、主にエクスポート部分が新しくなっています。
前のバージョンの基本的な使い方では、以下のように関数内にいろいろとコードを書くスタイルでした。
Excel::create('Filename', function($excel) { // ここに何か });
それが、3.0からは独自クラスを定義する形になったようです。
では、実際に見ていきましょう!
インストール
まずは、インストールです。
といってもAuto-Discovery(ServiceProviderを自動登録してくれる機能)があるんで、本当にcomposer一発で準備完了です。
composer require maatwebsite/excel
エクスポート
まずは、エクスポート専用のクラスを(ルートフォルダ)/app/Exportsに作成します。
※この例はFromCollectionを使ってます。collection()の中でデータとなるLaravelのコレクションを返してあげましょう。
(app/Exports/ItemsExport.php)
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\FromCollection; class ItemsExport implements FromCollection { public function collection() { return \App\Item::all(); } }
そして、コントローラー内で以下のように記述するだけでOKです。
<?php namespace App\Http\Controllers; use App\Exports\ItemsExport; class HomeController extends Controller { public function excel_download() { return \Excel::download(new ItemsExport, 'items.xlsx'); }
すごくシンプルですね♪
そして、もっと短いコードですませたい人には、Exportableトレイトも用意されています。やり方はトレイトを読み込むだけ。
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\Exportable; use Maatwebsite\Excel\Concerns\FromCollection; class ItemsExport implements FromCollection { use Exportable; public function collection() { return \App\Item::all(); } }
すると、次のような短いコードでExcelファイルをダウンロードさせることができます。
<?php namespace App\Http\Controllers; use App\Exports\ItemsExport; class HomeController extends Controller { public function excel_download() { return (new ItemsExport)->download('items.xlsx'); }
条件付きの場合はどうする?
コンストラクタに引数を入れてやることで、where句などを可変にすることができます。
※この例はFromQueryを使ってます。query()でDBのqueryを返してあげましょう。
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\Exportable; use Maatwebsite\Excel\Concerns\FromQuery; class ItemsExport implements FromQuery { use Exportable; public function __construct(string $name) { $this->name = $name; // Where句のデータ } public function query() { return \App\Item::where('name', $this->name); } }
そして、使い方はこうなります。
return (new ItemsExport('名前'))->download('items.xlsx');
CSVファイルのエクスポートは?
試してみたところ、ダウンロードしたいファイル名の拡張子を.csvにするだけ。なんとも便利ですね。
return (new ItemsExport)->download('items.csv');
しかし、残念ながら、我々日本人の懸案事項であるShift_JISには対応してないので、文字列をmb_convert_encodingで変換しても空白になってしまいます。(←どうやら親パッケージのphpoffice/phpspreadsheetが対応してないようです)
もしShift_JISのCSVをダウンロードさせたい場合は、私が公開しているパッケージ「FluentCsv」を使ってみてください。
参考: Laravel-Excel の CSV文字化けに絶望したのでパッケージを作った!
それにしても、日本はいつまでShift_JISに無駄な時間を割かなきゃいけないんだろうか・・・・・・・(汗)
もしかするとミドルウェアとかをいじれば実現可能かな???
といったところで、今回は以上です。
ではでは〜。