Posted at

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

https://github.com/mk-j/PHP_XLSXWriter/blob/master/examples/ex08-advanced.php

目的が果たせるのか確認していてソースを見ると、シンプルな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();

が該当する。

これはいろいろ触ってみたがわからなかった。。