PHP5.2~でエクセル出力するライブラリ mk-j/php_xlsxwriter


ライブラリについて

PHPでエクセル出力する場合、ライブラリにPHPExcelとかがあるが、だいぶ古くてもうすぐ更新されなくなる。
composerインストールできるものを探していると新しいのがあるが、PHP7必須だったりする。
PHP5.2以上だとmk-j/php_xlsxwriter というのがあった。

クラスファイル分けしてなくて、1ファイルに全機能が入っている。あまり機能充実はしていない。
特色としては、「Never run out of memory with PHPExcel again.」とうたっている。出力をバッファすることでPHPExcelみたいなメモリオーバーを防止しているよということらしい。

機能を見る

Readmeと同梱のexamples11例を見ると、だいたい使い方がわかる。

セルの結合は次のような書き方。
$writer->markMergedCell($sheet1, $start_row=0, $start_col=0, $end_row=0, $end_col=4);
文字列の折り返し表示はスタイルにwrap_text=>trueを指定する。
$writer->writeSheetRow($sheet4, array(101,'this text will wrap' ), $row_options = array('height'=>30,'wrap_text'=>true));

目的が果たせるのか確認していてソースを見ると、シンプルなXMLを出力していることがわかった。VBAとXMLで単語が統一されているのでわかりやすい。
Excelを作るXMLの仕様についてはこちらのサイトとかがとても役に立った。
https://p-space.jp/index.php/development/open-xml-sdk

たとえばセルの枠線は標準の機能で引けるが、(右上から左下などの)斜線を引くオプションがない。
(VBA)
BorderC7.DiagonalUp = new BooleanValue(true);
(XML)
<border diagonalUp="true">

みたいな書き方だとわかったので、該当の箇所を探して変更できた。

あとは行幅を文字列の長さで調節してほしい。
<col customWidth="true">
と書いている箇所があって、
VBAだと
ws.Column(1).AdjustToContents();
が該当する。
これはいろいろ触ってみたがわからなかった。。