PHPで帳票(PDF)をExcel(テンプレート)から生成するクラスを作ってみた


はじめに

このところコロナの影響で暇になってしまったので、
昨年(2019)の10月頃にWebの業務アプリを作る事になった時のライブラリを公開したいと思います。

業務アプリなので、帳票がいくつかあって「TCPDF」などでゴリゴリ書いてもよいのですが、保守性を考えてレイアウトをExcelファイルで作成したいなと。
ところが、いろいろライブラリを探しても使えそうなものが、なかなか見つかりません。
そこで「PHPExcel」の後継の「PhpSpreadsheet」が結構使えそうたったので、「TCPDF」と組み合わせて作ってみました。

概要

このクラスでは、エクセルファイルを読み込んで、セルの修飾情報などを読み込みます。
使う人は、必要に応じてシートオブジェクトに対して各種データのセットを行い、PDF出力メソッドによりWebページにPDFが出力されます。
基本的な使い方はこんな感じ↓

MainController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use \App\Lib\excel2pdf;
use \PhpOffice\PhpSpreadsheet\IOFactory;
/**
 * テスト(メインコントローラ)
 */
class MainController extends Controller
{
    /*
     *  テスト1
     */
    public function index()
    {
        $ex =new excel2pdf();
        $fname  = '..\storage\app\public/test.xlsx';    //帳票のレイアウトのエクセル

        $ex->setExcelFilename($fname);
        $book   = $ex->getBook();           //ブックオブジェクトも取得出来るよ

        $sheet  =null;
        if($book != null) {                 //念のため
            $sheet = $ex->getSheet();       //シートオブジェクトを取得
            //セルに値をセットなどを行う
            $sheet->setCellValue('A18', 'まつもと');
            $sheet->setCellValue('D18', 15);        //数量
            $sheet->setCellValue('E18', 1200);      //単価
            //・・・・
            //・・・・

            $ex->setSheet($sheet);      //出力するシートを指定(ここでセルの修飾情報を取得していたと思う)

            $ex->writePDF();            //PDF出力・・・この後 exit()?
        }
    }
}

基本的な考え方は、出力するシート内の値と修飾情報を解析してセル単位でPDFに出力します。
ただし、PhpSpreadsheetにも不具合と思われる現象もいくつか見られ、バージョンによっては、レイアウトが思い通りにいかないことがあるかもしれません。
例えば、デフォルトのままだとセルの幅が取得出来ないとか。

あと、レイアウトの反映がうまくいかないときは、エクセルのセル等の設定を更新してみてください。
時々、それで修飾情報が取得できるようになる事があります。
1枚ものの帳票は、Excelファイルの設定に注意すれば、ほぼ問題なくPDF化できると思います。
あと、ソースコードを見て頂くと分かると思いますが「PhpSpreadsheet」でのセル情報へのアクセスの方法などが参考になると思います。
ただ、完全にエクセルのレイアウトを再現するのは難しいのがよく分かりました。(文字単位の設定など)
自分で使える程度の再現ができれば良しとしました。
罫線の太さなども適当ですよ。

「excel2pdf.php」の主な制約

・セルの配置の「自動」には対応していません。
・オブジェクト・図形などは対応していません。(印鑑など出力されません)
・セル内の文字単位での修飾には対応していません。
・フォントの指定は適当に代替えフォントにします。
・ユーザ定義の罫線などには対応してません。
等々

PDF出力の例は、こちら


サンプルコードの説明

ララベルのプロジェクトになっています

◆テスト部分(メインコントローラ)
\xls2pdf\app\Http\Controllers\MainController.php

◆ライブラリ
\xls2pdf\app\lib\excel2pdf.php

◆レイアウトのエクセルの場所
\xls2pdf\storage\app\public

環境

 OS:Windows10 CentOS など
 PHP7,composer がインストール済みである事

お試し手順

①Gitからソースを取得
https://github.com/pheasant99/xls2pdf

②「xls2pdf」フォルダへ移動して
 composer install --ignore-platform-reqs
 ↓でもいいけどエラーが出るかも(設定ミス?)
 composer install

③「.env」ファイルの準備
 (.env.exampleをコピーしてリネーム)

④キーを生成(ララベルのため)
 php artisan key:generate

⑤サーバ起動
 php artisan serve
 
 ブラウザから
 http://localhost:80

最後に

なお、ソースコードは改良した場合や流用した時は、連絡を頂きたく思います。
一応、著作権は放棄しないけど勝手に参考にしてください。

以上です。