Laravel 5.2 で Excel出力


Laravel 5.2 で Laravel-Excelを使ったメモです
忘れないうちに急いで自分のために書いたメモなので間違いなど多々あるかもしれませんが、なにかお気づきな事がございましたらご忌憚なくなんでも御指摘していただけたら本当にありがたい次第でございます

#Laravel 5.5 補足(2017.12.12)
Laravel 5.5 でのインストールは github の [Instration](https://github.com/Maatwebsite/Laravel-Excel#installation) の通り
```
composer require "maatwebsite/excel:~2.1.0"
```
これだけで OK でした。簡単！

#インストール
[ドキュメント](https://github.com/Maatwebsite/Laravel-Excel)の Instration の ***For Laravel 5.2*** の記載を見落とさないように、 ***composer.json に Laravel-Excel と laravelcollective/bus を 追加*** して composer update

``` composer.json
    "require": {
        "php": ">=5.5.9",
        "laravel/framework": "5.2.*",
        "laravelcollective/html": "^5.2",
        "laravelcollective/bus": "^5.2",
        "maatwebsite/excel": "~2.1.0"
    },
```

```bash:実行
composer update
```

#設定
config/app.php に excel と bus の記載を追加

```config/app.php
'providers' => [
 ...
        Collective\Bus\BusServiceProvider::class,
        Maatwebsite\Excel\ExcelServiceProvider::class,
    ],

'aliases' => [
...
        'Excel' => Maatwebsite\Excel\Facades\Excel::class,

    ],

```

#コード
これがもの凄く簡単で ***単に array つくって渡してあげると必要なHttp header も作って出力してくれる*** という感じです phpexcel でシートの行毎の出力つくって HTTP header つくって、という手間がなくなってしまいました。

例えば、Plant という model があったとして、PlantControllerに

``` PlantController.php
use Illuminate\Http\Request;

use App\Http\Requests;

use App\Plant;

use Excel;

class PlantController extends Controller
{
public function excel()
    {
        //
        $plants = Plant::all();
        
        
        Excel::create('plants', function($excel) use($plants) {
            $excel->sheet('Sheet 1', function($sheet) use($plants) {
                $sheet->fromArray($plants);
            });
        })->export('xls');
    }
}
```

とか書いて、例えば以下のように route を用意して

```route.php
# 注意：
# @excel は @show より先に来ないと
# excel が {id} だと解釈されてエラーになる  

Route::get('plant/excel', 'PlantController@excel');
Route::get('plant/{id}', 'PlantController@show');

```

http:アプリケーション/plant/excel をブラウザで読むと、下記のようなキレイなExcel ファイルがダウンロードされます

![スクリーンショット 2016-08-30 8.43.46.png](https://qiita-image-store.s3.amazonaws.com/0/46544/c1c32989-da4a-8a4b-89ad-1ca8947eb4ba.png "スクリーンショット 2016-08-30 8.43.46.png")

これだと外部参照キーとかもそのまま出力されてしまうので、クエリビルダーをつかって例えば

```HarvestingController.php

$harvestings = Harvesting::join('plantings', 'plantings.id', '=', 'harvestings.planting_id')
            ->join('shelves', 'shelves.id', '=', 'plantings.shelf_id')
            ->join('plants', 'plants.id', '=', 'plantings.plant_id')
            ->select(
                'harvestings.id as harvesting_id',
                'shelves.name as shelf_name',
                'plants.name as plant_name',
                'plantings.id as planting_id',
                'plantings.planted_at',
                'harvestings.harvested_at',
                'harvestings.weight',
                'harvestings.created_at',
                'harvestings.updated_at',
                'harvestings.deleted_at'
                )
            ->get();
        //$users = User::select('id', 'name', 'email', 'created_at')->get();
        Excel::create('harvestings', function($excel) use($harvestings) {
            $excel->sheet('Sheet 1', function($sheet) use($harvestings) {
                $sheet->fromArray($harvestings);
            });
        })->export('xls');
```
とかやってつくった array を渡してあげるだけで、外部キーも名前に置き換えて下記のようないい感じの Excel を作ってくれます

![スクリーンショット 2016-08-30 8.49.27.png](https://qiita-image-store.s3.amazonaws.com/0/46544/6aa9c445-e8e6-b0b3-0b2a-b9562a83b444.png "スクリーンショット 2016-08-30 8.49.27.png")


#Class 'Excel' not found
最初、このエラーでハマりました。[こちらの Issue report](https://github.com/Maatwebsite/Laravel-Excel/issues/510)のとおり、下記のコマンドで解決しました

```
php artisan config:cache
```

この Issue をあげて、なおかつ自己解決を報告してくださっていた simtrax さんに感謝です!

#感想
単に excel を出力するだけだととても簡単に使えて便利ですし、充実した[ドキュメント]()を見てるといろいろと便利そうなことができるみたいで、これはワクワクしてきてとても楽しいです

#futur works
やっと Laravel 5.2 が少しだけわかってきたかな... と喜んでいたら [もう Laravel 5.3 がリリースされて](http://qiita.com/saab/items/cad8f724715b0aec8702)るんですよね。永遠にバージョンアップを追いかけ続けるのはソフト屋の宿命なのか...
Laravel-Excel は Laravel 5.3 でも動くかな?

#参考リンク

1 [Laravel-Excel](https://github.com/Maatwebsite/Laravel-Excel)の github

2 Laravel-Excel の [documents](http://www.maatwebsite.nl/laravel-excel/docs).

+ [Getting Started](http://www.maatwebsite.nl/laravel-excel/docs/getting-started) インストレーションとかコンフィグとかライセンスとか
+ [Import](http://www.maatwebsite.nl/laravel-excel/docs/import) Excel を読む時のドキュメントだと思います。使わなかったので読んでないですけど
+ [Export](http://www.maatwebsite.nl/laravel-excel/docs/export) Excel 出力のドキュメント
+ [@Blade to Excel](http://www.maatwebsite.nl/laravel-excel/docs/blade) 使ってないのですけど読み込んだ Excel をきれいに出力してくれるライブラリみたいです。ちょっとみた感じ便利で楽しそう。
+ [Reference guide](http://www.maatwebsite.nl/laravel-excel/docs/reference-guide) プロパティとかスタイルとかフォーマットとかのリファレンスがすっきりまとまってます

3 [Class 'Excel' not found](https://github.com/Maatwebsite/Laravel-Excel/issues/510) Laravel-Excel の Issue #510　「自己解決した、php artisan config:cache したら動いたよ！」と、この Issue report がなかったら私は ***多分使うの諦めて*** ました。Thx!