Help us understand the problem. What is going on with this article?

Laravel 5.2 で Excel出力

More than 1 year has passed since last update.

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!

UedaTakeyuki
Mais à l’instant même où la gorgée mêlée des miettes du gâteau toucha mon palais, je tressaillis, attentif à ce qui se passait d’extraordinaire en moi. - Marcel Proust: À la recherche du temps perdu
https://atelierueda.uedasoft.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした