目次
前回は・・・
前回はPHPでExcelファイルを操作する方法をまとめました。基本的にはCSV出力や一括登録の代替案としてまとめましたが、PhpSpreadsheetを使うことでExcelで作成した書類のフォーマットにPHPでデータを入力してPDFで出力することが可能となります。
今回はそれについてやっていきたいと思います。
考え方
考え方としては大きく分けて3つになります。- 書類のフォーマットをExcelで作りサーバーに保存する
- 保存したExcelファイルを読み込み、PHPで入力されたデータをExcelに入力する
- ExcelファイルをPDF出力し、サーバー上に保存する
最初の1つめに関してはこんな感じで作りました。
Excelにあるサンプルフォーマットをほぼそのまま使ってます。
(会社のロゴは絵文字にしてます)
このExcelファイルをサーバーに保存します。
(webからアクセスできない領域に保存してください)
保存したフォーマットにデータを入れる
次に先ほどアップしたExcelファイルを開き、セルに値を入れていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
require '../vendor/autoload.php'; // Composerでライブラリを読み込む use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; // 請求書フォーマットパス $format_path = "../assets/bill_format.xlsx"; // Excelファイルを読み込む $spreadsheet = IOFactory::load($format_path); // あなたのExcelファイルのパスを指定 $company_name = "テスト株式会社"; $company_address = "〒160-0001 東京都渋谷区渋谷2-85-5\nなんとかビル"; $tel_no = "03-1234-5678"; $billing_no = "請求書番号:10001"; $bill_date = date("Y年m月d日"); $description = "○○商品代"; // Excelファイルからデータを取得 $worksheet = $spreadsheet->getActiveSheet(); // B2セルに会社名を設定 $worksheet->setCellValue('B2', $company_name); $worksheet->setCellValue('B3', $company_address); $worksheet->setCellValue('B4', $billing_no); $worksheet->setCellValue('B5', $bill_date); $worksheet->setCellValue('B7', $company_name); $worksheet->setCellValue('B8', $company_address); $worksheet->setCellValue('B9', $tel_no); // 項目 $worksheet->setCellValue('B11', "あんパン"); $worksheet->setCellValue('C11', 1680); $worksheet->setCellValue('B12', "カレーパン"); $worksheet->setCellValue('C12', 1980); $worksheet->setCellValue('C7', $description); // Excelファイルにデータを書き出し $writer = new Xlsx($spreadsheet); $excelFilePath = '請求書.xlsx'; $writer->save($excelFilePath); |
基本的には今までのやり方と同じですが、setCellValue()を使うことで、指定されたセルに値を入れることが可能です。
数字と文字列などの型をPHPと同じ感じで判別してくれるので0抜きが発生する事はなさそうですね
最後にExcelで保存します。
ExcelからPDFへ変換する
いよいよ変換するのですが、やり方自体は二種類あり、どちらかかなと思います。mpdfで変換する
mpdfは今も更新されているライブラリです。
1 |
composer require mpdf/mpdf |
インストール後にIOFactoryのcreateWriterを使って変換します。
1 2 3 |
$writer->setFont('kozgopromedium'); $pdfFilePath = 'Mpdf 請求書.pdf'; // ファイル名を日本語に設定 $writer->save($pdfFilePath); |
変換した結果が下記のようになります。
デザインはある程度変換されてますが、日本語フォントが全然再現されません・・・
TCPDFで変換する
こちらは古くからある古のライブラリです。最近更新が停滞してるのが気になるところです・・・
1 |
composer require tecnickcom/tcpdf |
IPAexフォントのインストール
日本語フォントで表示したいので、無償の日本語フォントであるIPAexフォントをインストールします。ここからIPAexフォントのダウンロードを行います。
ダウンロード後はフォントファイル(.ttfファイル)を「vendor\tecnickcom\tcpdf\tools」にコピーします
コピー後は下記のコマンドを叩いてください。
1 2 |
php tcpdf_addfont.php -b -t CID0JP -f 32 -i ipaexg.ttf php tcpdf_addfont.php -b -t CID0JP -f 32 -i ipaexm.ttf |
そうすると「Process successfully completed!」の文字とともに「ipaexg.php」と「ipaexm.php」が作られます。
これでフォントのインストールが成功です。
1 2 3 4 |
$writer = IOFactory::createWriter($spreadsheet, 'Tcpdf'); $writer->setFont('ipaexg'); // フォントを指定 $pdfFilePath = 'Tcpdf 請求書.pdf'; // ファイル名を日本語に設定 $writer->save($pdfFilePath); |
フォントを指定してから作成すると下記のようになります。
日本語表示はされてますが、フォントサイズやレイアウトがバラバラですね・・・
結局何がいいの?
どちらも一長一短というか無視できないくらいのデメリットがあるので、実際に運用するとするとシンプルなレイアウトであればTCPDF、人本後を使わない場合はmtcpといった感じでしょうか
他にも「LibreOffice」を使った変換や「Microsoft Graph API」を利用する方法があるようですが、サーバにインストールしたり、有料のAPIのようなので中々難しいようです。
現状としてはHTMLでフォーマットを作ってTCPDFで実装するのが一番いいかなと言う感じがします。
今後は「Microsoft Graph API」でやってみたいと思いますね・・・