【Laravel】Laravel-Excelで色々やるための入り口

 Laravel は PHP フレームワークのひとつで、Laravel-Excel は Laravel を使ったプログラムの中で Excel ファイルを操作、入出力するのに便利な ライブラリです。次のコマンドでインストールできます。composer require maatwebsite/excel
Supercharged Excel exports and imports in Laravel | Laravel Excel
SpartnerNL/Laravel-Excel: 🚀 Supercharged Excel exports and imports in Laravel
 このライブラリを用いると配列、Collection、SQL などを元に Excel ファイルを生成するのが楽になります。例えば、次の様にして複数シートのExcelファイルを生成できます。

Excelファイル生成例
<?php
// app/Library/Excel/Model/ExcelFile.php

namespace App\Library\Excel\Model;

use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;

/**
 * Excel ファイルモデル
 */
class ExcelFile implements WithMultipleSheets
{
    // Excelファイルとして出力できるようになる trait
    use Exportable;

    private array $sheets = [];

    public function addSheets(ExcelSheet $sheet): void
    {
        $this->sheets[] = $sheet;
    }

    /**
     * \Maatwebsite\Excel\Concerns\WithMultipleSheets の指定。
     * 複数のシートから成る Excel ファイルであることを示す
     * @return array
     */
    public function sheets(): array
    {
        return $this->sheets;
    }
}
<?php
// app/Library/Excel/Model/ExcelSheet.php
namespace App\Library\Excel\Model;


use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithTitle;

/**
 * Excel シートモデル
 */
class ExcelSheet implements WithTitle, FromArray
{
    /**
     * @param  string  $sheetName  シート名
     */
    protected string $sheetName;

    /**
     * @param  string  $sheetName  シート名
     */
    public function __construct(string $sheetName)
    {
        $this->sheetName = $sheetName;
    }

// PHP8 以降ならば↑の初期化を次の様に書けます。
//    /**
//     * @param  string  $sheetName  シート名
//     */
//    public function __construct(
//        protected readonly string $sheetName
//    ){}

    /**
     * データ本体を格納する。
     * 外から好き勝手操作することが多いのでいっそ public 化。
     * @var array
     */
    public array $rows = [];

    /**
     * シート名。\Maatwebsite\Excel\Concerns\WithTitle の指定
     * @return string
     */
    public function title(): string
    {
        return $this->sheetName;
    }

    /**
     * データ本体。\Maatwebsite\Excel\Concerns\FromArray の指定
     * @return array
     */
    public function array(): array
    {
        return $this->rows;
    }
}

 ↑二つのモデルを用いて↓のコマンドを実行すると複数シートの Excel ファイルが出来上がります。

<?php

namespace App\Console\Commands;


use App\Library\Excel\Model\ExcelFile;
use App\Library\Excel\Model\ExcelSheet;
use Illuminate\Console\Command;

// php artisan excel-demo で実行
class ExcelDemo extends Command
{
    protected $name = 'excel-demo';

    public function handle(): int
    {
        // ファイルを用意
        $excel       = new ExcelFile();
        // シートを用意。ここは Excel を使う目的に応じて色々良く変わります
        $sheet       = new ExcelSheet('シートその1');
        $sheet->rows = [
            ['1行1列目', '浜松太郎'],
            ["複数行を持つセル内の1行目\n複数行の2行目\n3行目"]
        ];
        // 用意したシートをファイル内に追加
        $excel->addSheets($sheet);
        // 2枚目のシートも追加
        $sheet       = new ExcelSheet('シートその2');
        $sheet->rows = [['1行1列目'],];
        $excel->addSheets($sheet);

        // ファイルをローカルに保存。 store の代わりに download などもできます。
        $excel->store('excelDemo_'.now()->format('YmdHis').'.xlsx');

        return 0;
    }
}

 この Laravel-Excel ですが、次のドキュメントを読むほかにやれることを知る大きな道筋が二つほどあります。
Introduction | Laravel Excel
 一つは Laravel-Excel 本体に含まれる Concerns の中身を見ることです。これはインストール後 vendor/maatwebsite/excel/src/Concerns に生成されるディレクトリです。この中には Laravel-Excel 用のインターフェースとトレイトが詰まっています。

 Laravel-Excel は Excel に使うためのクラスに何か機能を足すときにはインターフェースの実装を要求します。またトレイトには Laravel-Excel で使える便利な実装が色々入っています。Concerns 内のファイルの名前を読むことでできそうなことが粗方把握できます。また、各インターフェースについて”Laravel-Excel ${インターフェース名}”でググると大体詳しい使い方がでてきます。

 もう一つは PhpSpreadsheet のドキュメントとソースコードを参照することです。
Welcome to PhpSpreadsheet’s documentation – PhpSpreadsheet Documentation
PHPOffice/PhpSpreadsheet: A pure PHP library for reading and writing spreadsheet files
 Laravel-Excel は PhpSpreadsheet を Laravel 上で扱いやすくラッピングしたライブラリであるため、細かい制御は Laravel-Excel の中から PhpSpreadSheet の部分を引っ張り出して色々することでできます。この際は大体 \Maatwebsite\Excel\Sheetインスタンス->getDelegate() で PhpSpreadSheet の部分を呼び出します。例えば次です。

// A1:D1 の領域を上揃えにします
/** @var \Maatwebsite\Excel\Sheet $sheet */
$sheet->getDelegate()
    ->getStyle("A1:D1")
    ->getAlignment()
    ->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP);
>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG