バージョン
- laravel5.8
- maatwebsite/excel3.1
今回は練習例題として、日数をExcelでダウンロードさせたいと思います。
こちらの記事を参考にさせていただきます。
準備
「Laravel Excel」パッケージをインストールします
PhpSpreadsheetを元に作成されたLaravelでExcelを扱うときの便利ライブラリ
composer require maatwebsite/excel
docker環境でエラーが出る場合
- phpoffice/phpspreadsheet 1.6.0 requires ext-gd * -> the requested PHP extension gd is missing from your system.
- phpoffice/phpspreadsheet 1.5.2 requires ext-gd * -> the requested PHP extension gd is missing from your system.
- phpoffice/phpspreadsheet 1.5.1 requires ext-gd * -> the requested PHP extension gd is missing from your system.
- phpoffice/phpspreadsheet 1.5.0 requires ext-gd * -> the requested PHP extension gd is missing from your system.
- phpoffice/phpspreadsheet 1.4.1 requires ext-gd * -> the requested PHP extension gd is missing from your system.
- phpoffice/phpspreadsheet 1.4.0 requires ext-gd * -> the requested PHP extension gd is missing from your system.
- Installation request for maatwebsite/excel ^3.1 -> satisfiable by maatwebsite/excel[3.1.0, 3.1.1, 3.1.10, 3.1.11, 3.1.12, 3.1.13, 3.1.2, 3.1.3, 3.1.4, 3.1.5, 3.1.6, 3.1.7, 3.1.8, 3.1.9, 3.1.x-dev, 3.2.x-dev].
To enable extensions, verify that they are enabled in your .ini files:
- /usr/local/etc/php/php.ini
- /usr/local/etc/php/conf.d/docker-php-ext-mysqli.ini
- /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini
- /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini
- /usr/local/etc/php/conf.d/docker-php-ext-zip.ini
You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.
Installation failed, reverting ./composer.json to its original content.
依存関係エラーらしいので[https://translate.google.com/translate?hl=ja&sl=en&u=https://github.com/nanoninja/docker-nginx-php-mysql/issues/28&prev=search]
composer require maatwebsite/excel --ignore-platform-reqs
これで、インストール系の準備は整いました。
##Facadeを利用しない
日数をexportするためのファイルを作成します。
php artisan make:export DateExport
Exports/DateExport.phpが作成されたと思います。
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
class DateExport implements FromCollection
{
public function collection()
{
}
}
FromCollectionはcollectionメソッドの中に、Collectionのデータをいれてそのままダウンロードできます。(例:Model::all()など)
今回は、1~31を記述します。注意点としては、Modelの取得データをそのまま返したりできるため、collectionメソッドには、多次元で記述する必要があります。(FromArrayを使った場合も)
日付1から31まで記述して出してみます。
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromCollection;
class DateExport implements FromCollection
{
use Exportable;
public function collection()
{
return collect(
[
0 => [
range(1, 31)
]
]
);
}
}
ポイントとしては、use Exportableを使うと、Excelファサードを用意しないでも、Excelファイルをダウンロードさせることができます。
range関数で1~31までの配列を用意しています。
あとは、ルートを用意するだけですね。
Route::get('export', 'SampleController@export');
<?php
namespace App\Http\Controllers;
use App\Exports\DateExport;
class SampleController extends Controller
{
public function export(){
return (new DateExport())->download('date.xlsx' ) ;
}
}
DateExportクラスをインスタンス化して、downloadメソッドを呼んでいます。use Exportableを記述しているおかげで、downloadメソッドを使用できます。
また、csvやほかの形でダウンロードしたい場合も、ファイル名を変えれば可能です。pdfは別パッケージをすれば、ダウンロードできます
早速アクセスしてみます。
![Screenshot_2.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F325600%2F27e22cce-a72d-de22-811c-a45fd8d11f93.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=631b1d8489fa84fa8b7b3c1630f80a15)
こんな感じになります。1 => [range(1, 31)]を記述すれば、2行になります(0=>の中にrange(1,31)を入れても2行にできる)
##Facadeを利用する
Facadeを利用するために、ProviderとExcelクラスの登録を行います。
'providers' => [
Maatwebsite\Excel\ExcelServiceProvider::class,
],
'aliases' => [
'Excel' => Maatwebsite\Excel\Facades\Excel::class,
],
設定ファイル(excel.php)を作成し、キャッシュをクリアしときます。
php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider"
php artisan config:cache
Facadeを利用しないで、作成したDateExportをそのまま利用して、SampleControllerだけ変更します。
<?php
namespace App\Http\Controllers;
use App\Exports\DateExport;
use Maatwebsite\Excel\Facades\Excel;
class SampleController extends Controller
{
public function export(){
return Excel::download(new DateExport(), 'date.xlsx');
}
}
Excelファサードを利用するようにしましたので、DateExportのuse Exportable;の記述を消してもダウンロードできます。
あとは、アクセスすればダウンロードできます。
ほかにも、viewからダウンロードする方法なんかもあるらしいです。
##まとめ
すごく簡単にできた。先人の人たちありがとうございます。
この後は、これを生かして、Sheetを複数にしたり、Excelファイルのセルの背景色をいじったりして、もっとデータを見やすく、自動で出せるものを作成していきたいと思います。