やりたいこと
laravelで請求書などの帳票を
・エクセル
・PDF
の形式でDLさせたい。
DLさせる帳票のテンプレートはエクセルで作成したい。
(前回htmlでテンプレートを作成したが微調整が大変だったため)
必要なライブラリのインストール
・Maatwebsite Laravel Excel
コンソール
composer require maatwebsite/excel
・Dompdf (HTMLをPDF化するライブラリ)
コンソール
composer require dompdf/dompdf
日本語フォントのインストール
IPAフォント 4書体パック(Ver.003.03)
zipファイルとしてダウンロードされます。
その中にあるファイルをstorage/fonts/ディレクトリの下にコピー。
ユーティリティツールをダウンロード
ttfファイルをcssのfont-familyから呼び出せる形式に変換してくれるユーティリティツール。
load_font.php
これをDompdfのディレクトリに直接配置します。
vendor/dompdf/dompdf/
以下のようにしてフォントをロードさせる。
コンソール
php vendor/dompdf/dompdf/load_font.php ipag storage\font\ipag.ttf
帳票のテンプレートを設置
以下にテンプレートとなるエクセルファイルを設置
storage\app\private\templates
例)template.xlsx
一次ファイル置き場に以下のフォルダも作成しておく
storage\app\private\temp
テンプレートに値を入れてDL
use Illuminate\Support\Facades\Storage;
use Maatwebsite\Excel\Facades\Excel;
use PhpOffice\PhpSpreadsheet\IOFactory;
use Dompdf\Dompdf;
use Barryvdh\DomPDF\Facade\Pdf;
// ストレージからテンプレートExcelを読み込む
$templatePath = Storage::path('templates/template.xlsx'); // ストレージのファイルパス
$spreadsheet = IOFactory::load($templatePath);
// フォントを明示的に設定
$spreadsheet->getDefaultStyle()->getFont()->setName('ipag');
// 必要な値を挿入 (例: シート1の特定のセルにデータを入れる)
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1', '会社名: Example Inc.');
$sheet->setCellValue('B2', '2025-01-01'); // 日付
$sheet->setCellValue('C3', '製品名: Laravel Pro'); // 製品名
$sheet->setCellValue('D4', '数量: 100'); // 数量
$sheet->setCellValue('E5', '合計: ¥500,000'); // 合計
// 一時ファイルとして保存
$tempFilePath = Storage::path('temp/modified_template.xlsx');
$writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save($tempFilePath);
// ExcelをHTMLに変換
$html = IOFactory::createWriter($spreadsheet, 'Html');
ob_start();
$html->save('php://output');
$excelAsHtml = ob_get_clean();
// HTMLをPDFに変換
$dompdf = new Dompdf();
$dompdf->loadHtml($excelAsHtml);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
// PDFをダウンロードとして出力
return response()->streamDownload(function () use ($dompdf) {
echo $dompdf->output();
}, 'document.pdf');
// Excelを直接ダウンロードする場合
// return response()->download($tempFilePath)->deleteFileAfterSend(true);
以上のようにして帳票をDLさせることができます。