あるまげどーーーん

某ITベンチャー会社に所属する技術者たちの自習室

PHP-XLSXWriterの導入とはじめの一歩

majirou です!今回が初投稿となります。

社内システムではPHP-Excelでエクセル帳票をゴリゴリ作成していましたが、 ふと気づいてみると、PHP-Excelは非推奨となり、PHP-Spreadsheet なるものがあるとか。

さっそく、導入して試しに4,000行×120カラムぐらいの一覧データを作成してみたところ…

Allowed memory size of 8388608 bytes exhausted

Oh...

PHP-Excelの時も同じようなエラーが出たので、断念してCSVで運用を任せていたので、 「後継機なら、後継機ならメモリーエラーとか吐かずにやってくれるはず!」という思いは打ち砕かれました。

そんな矢先、調べれば出てくるものですね。

PHP_XLSXWriter

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