PHP-XLSXWriterの導入とはじめの一歩
majirou です!今回が初投稿となります。
社内システムではPHP-Excelでエクセル帳票をゴリゴリ作成していましたが、 ふと気づいてみると、PHP-Excelは非推奨となり、PHP-Spreadsheet なるものがあるとか。
さっそく、導入して試しに4,000行×120カラムぐらいの一覧データを作成してみたところ…
Allowed memory size of 8388608 bytes exhausted
Oh...
PHP-Excelの時も同じようなエラーが出たので、断念してCSVで運用を任せていたので、 「後継機なら、後継機ならメモリーエラーとか吐かずにやってくれるはず!」という思いは打ち砕かれました。
そんな矢先、調べれば出てくるものですね。
READMEには強気なフレーズが!!
Never run out of memory with PHPExcel again.
もう一度、書きます。
Never run out of memory with PHPExcel again.
…すばらしい!
ということで早速導入してみました。
導入
composer でインストールします。
# composer require mk-j/PHP_XLSXWriter Using version ^0.37.0 for mk-j/php_xlsxwriter ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals Writing lock file Generating autoload files
実装
公式サンプルをそのまま実施します。
include_once( VENDORPATH . "/mk-j/php_xlsxwriter/xlsxwriter.class.php" ) ;
$header = array(
'c1-text'=>'string',//text
'c2-text'=>'@',//text
'c3-integer'=>'integer',
'c4-integer'=>'0',
'c5-price'=>'price',
'c6-price'=>'#,##0.00',//custom
'c7-date'=>'date',
'c8-date'=>'YYYY-MM-DD',
);
$rows = array(
array('x101',102,103,104,105,106,'2018-01-07','2018-01-08'),
array('x201',202,203,204,205,206,'2018-02-07','2018-02-08'),
array('x301',302,303,304,305,306,'2018-03-07','2018-03-08'),
array('x401',402,403,404,405,406,'2018-04-07','2018-04-08'),
array('x501',502,503,504,505,506,'2018-05-07','2018-05-08'),
array('x601',602,603,604,605,606,'2018-06-07','2018-06-08'),
array('x701',702,703,704,705,706,'2018-07-07','2018-07-08'),
);
$writer = new XLSXWriter();
$writer->writeSheetHeader('Sheet1', $header);
foreach($rows as $row){
$writer->writeSheetRow('Sheet1', $row);
}
$writer->writeToFile( '/tmp/php_xlsxwriter_test.xlsx' ) ;
ポイント
ヘッダーで予め型を指定して流し込むようです。
$header = array(
'c1-text'=>'string',//text
'c2-text'=>'@',//text
'c3-integer'=>'integer',
'c4-integer'=>'0',
'c5-price'=>'price',
'c6-price'=>'#,##0.00',//custom
'c7-date'=>'date',
'c8-date'=>'YYYY-MM-DD',
);
結果
先ほどの4,000行×120カラムぐらいの一覧データですが、 Php-Excelで生成すると1分ほど経過したあたりで、メモリーオーバーとなっていたのですが、 Php-xlsxwriterでは、なんとたったの10秒!!
これで1分待った挙句の「何も生成できませんでした!」という絶望を味わうことのないサービスを社内に還元できそうです。