Laravel

Laravel & Maatwebsite Excelでエクセル印刷範囲と余白を設定し1ページに印刷

LaravelとMaatwebsite\Excelでビューを利用してエクセルに出力する基本的な方法と、エクセルの印刷範囲および余白、「シートを1ページに印刷」を設定する方法を以下に説明します。
具体的には、モデルからデータを取得し、ビューを通してそれを整形し、エクセルで出力します。

モデルの作成

User モデルを使用すると仮定して進めます。あなたのプロジェクトに合わせてデータを取得する方法を調整してください。

ビューの作成

エクセルに出力するためのビューを作成します。
ここでは、resources/views/export/users.blade.php を作成してみましょう。

<!-- resources/views/export/users.blade.php -->
<table>
    <thead>
        <tr>
            <th>ID</th>
            <th>Name</th>
            <th>Email</th>
        </tr>
    </thead>
    <tbody>
        @foreach($users as $user)
            <tr>
                <td>{{ $user->id }}</td>
                <td>{{ $user->name }}</td>
                <td>{{ $user->email }}</td>
            </tr>
        @endforeach
    </tbody>
</table>

エクスポートクラスの作成:セル印刷範囲と余白を設定し1ページに印刷

ビューとモデルを利用してエクセルファイルを作成するエクスポートクラスを作ります。

namespace App\Exports;

use App\User;
use Illuminate\Contracts\View\View;
use Maatwebsite\Excel\Concerns\FromView;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;

class UsersExport implements FromView, WithEvents
{
    public function view(): View
    {
        return view('export.users', [
            'users' => User::all()
        ]);
    }

    public function registerEvents(): array
    {
        return [
            AfterSheet::class => function(AfterSheet $event) {
                $sheet = $event->sheet->getDelegate();

                // 以下のコードで、「シートを1ページに印刷」の設定を行います。
                $sheet->getPageSetup()
                    ->setPrintArea('A1:E10');	//印刷範囲をA1からE10までに設定
                    ->setFitToWidth(1)  // 1ページの幅に合わせる
                    ->setFitToHeight(1); // 1ページの高さに合わせる

                $sheet->getPageMargins()	//以下上、右、左、下の余白をそれぞれ設定
                    ->setTop(0.75)
                    ->setRight(0.7)
                    ->setLeft(0.7)
                    ->setBottom(0.75);
            },
        ];
    }
}

  • setPrintArea(‘A1:E10’) – これによって印刷範囲をA1からE10までに設定しています。
  • setFitToWidth(1) と setFitToHeight(1)を利用して、印刷時にシートの内容が1ページに収まるように設定しています。
    通常、これらのメソッドに指定した値がシートの幅または高さに対して何ページ分かを表します。両方に 1 を設定することで、エクセルの印刷オプションが「シートを1ページに印刷」に設定されます。
  • getPageMargins()->setTop(0.75)->setRight(0.7)->setLeft(0.7)->setBottom(0.75); – これによって上、右、左、下の余白をそれぞれ設定しています(数値はインチ単位です)。

上記の方法は、後のバージョンのPhpSpreadsheetライブラリとMaatwebsiteのバージョン3.xに基づいています。
異なるバージョンを使用している場合、または未来のバージョンで変更があった場合、詳細は公式ドキュメントを確認してください。

コントローラの作成

次に、作成したエクスポートクラスを利用してエクセルをダウンロードするコントローラを作成します。

namespace App\Http\Controllers;

use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;

class UsersController extends Controller
{
    public function export()
    {
        return Excel::download(new UsersExport, 'users.xlsx');
    }
}

ルーティングの設定

最後に、routes/web.phpにルートを追加して、コントローラのメソッドを指定します。

use App\Http\Controllers\UsersController;

Route::get('users/export', [UsersController::class, 'export']);

この設定を行うことで、/users/exportへのリクエストはUsersControllerのexportメソッドをトリガーし、エクスポートクラスを通してエクセルが出力され、ダウンロードされます。印刷範囲と余白はエクスポートクラス内で設定されています。

 
 
※流用される場合は自己責任でお願いします。