LoginSignup
9
10

More than 3 years have passed since last update.

Laravel-Excelでbladeのテンプレートを使って複数シートで作成する

Last updated at Posted at 2020-10-24

概要

いろんな事務所に所属するバンドのデータを取得。bladeにテンプレートを作り、事務所ごとのデータをExcelファイルでダウンロードするというパターンを想定して実装する。テーブルはbladeにてテンプレートを作る。

Laravel-Excelのインストールの手順などは省く。
bladeでテンプレートを作って出力する方法は下記を参考。

Laravel-excel で帳票を出力する
https://qiita.com/ShibuyaKosuke/items/7e5e99c51546a578d97b

複数ファイルは出せないのか

最初はダウンロードする処理を foreach で回して事務所ごとにファイルをダウンロードする処理をすればいいだろうと安易に考えていたが、どうもそれはできないようで(ダウンロードする処理で return しなければならないため)、ファイルはひとつだが事務所ごとに複数シートで分けるということにした。
Laravel-Excel を使って複数シートでダウンロードする方法は公式サイトも含めて探せばいくつか見つかるが、bladeでテンプレートを作って出力するパターンのものは工夫して作らなければならなかった。

必要なファイル

以下4点のファイルを用意すれば作ることができる。
ディレクトリやファイル名は任意。
テンプレートとなるbladeは割愛する。

bandController.php
public function export()
{
// 中略

// 複数シートでのダウンロード
$view = \view('band_information.export')
    ->with('offices', $offices);
return (new MultiBookExport($view))->download("band_info.xlsx");
}
BandInfosExport.php
<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\Exportable;
use Illuminate\Contracts\View\View;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class BandInfosExport implements WithMultipleSheets
{
    use Exportable;

    private $view;

    public function __construct(View $view)
    {
        $this->view = $view;
    }

    public function sheets(): array
    {
        $sheets = [];
        $i = 1;

        // 事務所数
        $count = count($this->view->offices);

        // 事務所の数だけシートを作る
        foreach ($this->view->offices as $office) {

            $sheets[] = new BandInfosSheet($office);

            if ($i === $count) {
                return $sheets;
            }
            $i++;
        }
    }
}
<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\WithTitle;
use Illuminate\Contracts\View\View;
use Maatwebsite\Excel\Concerns\FromView;

class BandInfosSheet implements FromView, WithTitle
{
    private $office;

    public function __construct($office)
    {
        $this->office = $office; 
    }

    public function view(): View
    {
        // 事務所に所属するバンドのデータをbladeのテンプレートに渡す
        return \view('band_information.export')
            ->with('informations', $this->office['band_informations']);        
    }

    public function title(): string
    {
        // シート名となる事務所名を取得
        return $this->office->name;
    }
}
9
10
0

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
9
10