最新!Laravel Excel 3.0の新機能を試してみた

さて、いつも開発でお世話になってる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に無駄な時間を割かなきゃいけないんだろうか・・・・・・・(汗)
もしかするとミドルウェアとかをいじれば実現可能かな???

といったところで、今回は以上です。
ではでは〜。



にほんブログ村 IT技術ブログへ  にほんブログ村 IT技術ブログ プログラム・プログラマーへ


BugGUI バグ報告を効率化
たった3分でバグ報告完了!? BugGUI