PHP:Spreadsheet_Excel_Writerが動かない!?たった一文字の変更で動くかも!

PHP:Spreadsheet_Excel_Writerが動かない!?たった一文字の変更で動くかも!

author : koki

publish date :

昔に作ったPHPでDBの情報をエクセルファイルとしてダウンロードできるスクリプトを作ったのですが、久しぶりに動かしてみると動いていない。
前は正常に動いていたのに、今は真っ白な画面・・・
無事解決出来たけど、ハマったので解決方法を共有です。

原因追求

最初はスクリプトを設置するサーバーを変えたので、サーバーの設定の違いかなと思いスクリプト等問題のありそうな箇所を探していたのですが、問題はありませんでした。
正常に動いていないのはエクセルファイルとして書き出す部分だけだったのです。

使っていたのはPEARのSpreadsheet_Excel_Writerパッケージです。
このパッケージの最終更新日は2012年1月・・・
パッケージ自体がPHPのバージョンアップについてこれていない雰囲気ですね。

ということで、Spreadsheet_Excel_Writerについてググる。
いろんなページを見ながら、どんどん時間が過ぎていき、ようやく問題解決できるページを発見。

スクリプト修正

変更するファイルは、/pear/Spreadsheet/Excel/Writer/Worksheet.phpの2490行目にある$this->_append(&$string, true);の「&」を消します。

修正後のコード

該当箇所の関数をまるっと載せておきます。

2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
/**
* Store the MERGEDCELLS record for all ranges of merged cells
*
* @access private
*/
function _storeMergedCells()
{
    // if there are no merged cell ranges set, return
    if (count($this->_merged_ranges) == 0) {
        return;
    }
    $record   = 0x00E5;
    foreach($this->_merged_ranges as $ranges)
      {
        $length   = 2 + count($ranges) * 8;
        $header   = pack('vv', $record, $length);
        $data     = pack('v'count($ranges));
        foreach($ranges as $range)
          $data .= pack('vvvv', $range[0], $range[2], $range[1], $range[3]);
        $string=$header.$data;
        $this->_append($string, true);
      }
}

たった1行の変更するだけ!

いやー、この1行の問題を見つけるのに2時間潰れました。
プラグイン、ライブラリ、パッケージは開発時間を短縮してくれるので非常に助かるのですがこういう時は困ってしまいますね~。

このページにたどり着いた方は短時間で問題解決出来たことを願います。

参考URL

PEARのバグ報告に解決法がありましたが、見つけにくかった・・・