PHPでPDF出力 4(罫線を引く)

4.罫線の処理の追加

文字表示の体裁は整ったので、罫線の表示を追加する。

 TCPDFで罫線の定義は次の通りである。

Line(開始X座標、開始Y座標、終了X座標、終了Y座標、スタイル)

 スタイル:幅、末端部、結合部、破線パターン、破線パターンの開始位置、色

Excelはセル書式の「Borders」プロパティから取得できる。

下記の線種がどのような値で取得できるのか、上罫線で確認してみた。

   Excl線種の確認

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)));

-------------------------------------------------------------

    PDF線種の確認

鎖線を単純に破線にすると、メリハリがなくなる。また、二重線も気になる。

破線パターンで線の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での処理になる。