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
"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 の記載を追加
'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に
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 を用意して
# 注意:
# @excel は @show より先に来ないと
# excel が {id} だと解釈されてエラーになる
Route::get('plant/excel', 'PlantController@excel');
Route::get('plant/{id}', 'PlantController@show');
http:アプリケーション/plant/excel をブラウザで読むと、下記のようなキレイなExcel ファイルがダウンロードされます
これだと外部参照キーとかもそのまま出力されてしまうので、クエリビルダーをつかって例えば
$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 を作ってくれます
#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!