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分待った挙句の「何も生成できませんでした!」という絶望を味わうことのないサービスを社内に還元できそうです。