38
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel 5.2 で Excel出力

Last updated at Posted at 2016-08-30

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

#Laravel 5.5 補足(2017.12.12)
Laravel 5.5 でのインストールは github の Instration の通り

composer require "maatwebsite/excel:~2.1.0"

これだけで OK でした。簡単!

#インストール
ドキュメントの 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"
    },
実行
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

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

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

#Class 'Excel' not found
最初、このエラーでハマりました。こちらの Issue reportのとおり、下記のコマンドで解決しました

php artisan config:cache

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

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

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

#参考リンク

1 Laravel-Excelの github

2 Laravel-Excel の documents.

  • Getting Started インストレーションとかコンフィグとかライセンスとか
  • Import Excel を読む時のドキュメントだと思います。使わなかったので読んでないですけど
  • Export Excel 出力のドキュメント
  • @Blade to Excel 使ってないのですけど読み込んだ Excel をきれいに出力してくれるライブラリみたいです。ちょっとみた感じ便利で楽しそう。
  • Reference guide プロパティとかスタイルとかフォーマットとかのリファレンスがすっきりまとまってます

3 Class 'Excel' not found Laravel-Excel の Issue #510 「自己解決した、php artisan config:cache したら動いたよ!」と、この Issue report がなかったら私は 多分使うの諦めて ました。Thx!

38
41
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
41

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?