PHPでPDF出力 4(罫線を引く)
4.罫線の処理の追加
文字表示の体裁は整ったので、罫線の表示を追加する。
TCPDFで罫線の定義は次の通りである。
Line(開始X座標、開始Y座標、終了X座標、終了Y座標、スタイル)
スタイル:幅、末端部、結合部、破線パターン、破線パターンの開始位置、色
Excelはセル書式の「Borders」プロパティから取得できる。
下記の線種がどのような値で取得できるのか、上罫線で確認してみた。
1行目から順に、 -4142、1、1、-1418、5、4、-4155、-4119となった。
3行目の点線は直線と同じ値で区別がつかない。
これでジェネレートする処理を組み込もうとしたが、今度は、
TCPDFに鎖線(5,4)と二重線(-4119)に対応する定義がない。
取り敢えず、鎖線は破線、二重線は太い実線で組み込んだソースと実行結果は、
-------------------------------------------------------------
$tcpdf->Line(9, 6.5, 134.3, 6.5, array('width' => 0.2, 'cap' => 'butt', 'join' => 'miter','dash' => 0, 'color' => array(0,0,0)));
$tcpdf->Line(9, 11, 134.3, 11, array('width' => 0.2, 'cap' => 'butt', 'join' => 'miter','dash' => 0, 'color' => array(0,102,255)));
$tcpdf->Line(9, 15.5, 134.3, 15.5, array('width' => 0.2, 'cap' => 'butt', 'join' => 'miter','dash' => 1, 'color' => array(255,0,0)));
$tcpdf->Line(9, 20, 134.3, 20, array('width' => 0.2, 'cap' => 'butt', 'join' => 'miter','dash' => 2, 'color' => array(0,176,80)));
$tcpdf->Line(9, 24.5, 134.3, 24.5, array('width' => 0.2, 'cap' => 'butt', 'join' => 'miter','dash' => 2, 'color' => array(226,107,10)));
$tcpdf->Line(9, 29, 134.3, 29, array('width' => 0.2, 'cap' => 'butt', 'join' => 'miter','dash' => 2, 'color' => array(255,0,255)));
$tcpdf->Line(9, 33.8, 134.3, 33.8, array('width' => 0.6, 'cap' => 'butt', 'join' => 'miter','dash' => 0, 'color' => array(96,73,122)));
-------------------------------------------------------------
鎖線を単純に破線にすると、メリハリがなくなる。また、二重線も気になる。
破線パターンで線のON-OFFができることが分かり、それぞれ変更してみた。
$tcpdf->Line(9, 20, 134.3, 20, array('width' => 0.2, 'cap' => 'butt', 'join' => 'miter','dash' => '5,2' 'color' => array(0,176,80)));
$tcpdf->Line(9, 24.5, 134.3, 24.5, array('width' => 0.2, 'cap' => 'butt', 'join' => 'miter','dash' => '5,1', 'color' => array(226,107,10)));
また、二重線は実線2つに分解することで対応した。
左右の罫線は、右罫線を表示し、A列の左罫線を有効として実行した。
結合セルの扱い
何やら結合セルに余計な罫線が出力されている。
それも行が結合されているセルを疑い調査する。
Excelはセル書式の「Borders」プロパティの上罫線を取得しているのは前述している。
これだと最終行の下罫線が漏れてしまうので、解析は最終行+1で処理している。
セル(B2)は上罫線ONで、セル(B3)も上罫線ONになる。結合セルは見た目は罫線なしだが、プロパティはしっかりONになっている。
結合セルの2行目以降は無視する必要がある
結合セルは、「MergeCells」プロパティで判定でき、行数と列数はそれぞれ「MergeArea.Rows.Count」と「MergeArea.Columns.Count」で取得できる。
上記処理を追加して出力した結果である。
満足できる出来栄えで、ひとりニヤつくが、単価が5桁で目一杯に気づき我に返る。
カンマや6桁以上にではどうなる。
案の定、罫線に掛かってしまった。
次は、「縮小して全体を表示する」と「折り返して全体を表示する」の処理を追加。
これは、ジェネレーターだけでは対応できず、PHPでの処理になる。