「Spreadsheet_Excel_Writer」で「壊れている」旨出る問題の解決方法

「Spreadsheet_Excel_Writer」で「壊れている」旨出る問題の解決方法Web開発者の備忘録PHPでExcelファイルを作る必要性があり、PEARライブラリにある「Spreadsheet_Excel_Writer」を使ったのですが。
出来たExcelをOffice2010(2007以降)で開く時に「ファイルが壊れている」と出てしまいました。
「修復する」を選択しても表示すらされない、という問題です。

データをあれこれいじって分かったのですが、12件(行)以上データを出力しようとした場合に発生する事が判明。

「Spreadsheet_Excel_Writer 壊れて」などでググってみると以下のような解決策が見つかりましたが、不十分。
http://note.chiebukuro.yahoo.co.jp/detail/n122828
表示はされるようになるのですが、相変わらず「壊れている」と言ったメッセージが表示されるのです。

もうちょっとググったところ、以下の解決策を発見。こちらを採用します。
http://stackoverflow.com/questions/2674489/spreadsheet-excel-writer-data-output-is-damaged

対応方法は以下の通り。
・PEAR OLE のバージョンは最新の「1.0.0RC2」を使う
・OLE/PPS/Root.php 623行目の以下を修正
(旧) fwrite($FILE, pack(“V”, 1));

(新) fwrite($FILE, pack(“V”, $num_sb_blocks));
以上です。

これで、Office2007以降で「ファイルが壊れている」旨のメッセージも出なくなりました。

以下、参考までに「Spreadsheet_Excel_Writer」を使ったサンプル(抜粋)。
—————————————————————————————-
require_once ‘Spreadsheet/Excel/Writer.php’;
// ワークブックを作成します
$workbook = new Spreadsheet_Excel_Writer();
// HTTP ヘッダを送信します
$workbook->send(‘filename.xls’);
// ワークシートを作成します
$worksheet =& $workbook->addWorksheet(mb_convert_encoding(‘ワークシート名’,’sjis-win’,’UTF-8′));

// フォーマットの作成
$format_number =& $workbook->addFormat();
$format_number->setNumFormat( ‘#,##0’ ); // 表示形式を「カンマ区切りの数字」にする

// ヘッダー行の書き込み (参考):write(row,col,値)
$worksheet->write(0, 0, mb_convert_encoding( $in[‘year’].’年’ ,’sjis-win’,’UTF-8′ ));

$worksheet->write(1, 0, mb_convert_encoding( ‘コード’ ,’sjis-win’,’UTF-8′ ));
$worksheet->write(1, 1, mb_convert_encoding( ‘氏名’ ,’sjis-win’,’UTF-8′ ));
・・・・
$worksheet->write(1, 6, mb_convert_encoding( ‘法人個人区分’ ,’sjis-win’,’UTF-8′ ));
$worksheet->writeNote(1, 6, mb_convert_encoding(‘1:個人,2:個人以外’,’sjis-win’,’UTF-8′ ));
・・・・
$worksheet->write(1, 11, mb_convert_encoding( ‘支払金額’ ,’sjis-win’,’UTF-8′ ));

// データ行の書き込み
$xlsrow = 2;
while(!$rsu->EOF){
// 受給者コード(英数4ケタ)
$worksheet->writeString($xlsrow, 0, mb_convert_encoding( sprintf(‘%04d’,$rsu->fields[‘id’] ) ,’sjis-win’,’UTF-8′ ));
// 受給者氏名(52文字)
$worksheet->writeString($xlsrow, 1, mb_convert_encoding( mb_strimwidth($rsu->fields[‘name’] , 0 , 104 , ” , ‘UTF-8′) ,’SJIS’,’UTF-8′ ));
・・・・
// 支払金額
$worksheet->write($xlsrow, 11, $rsu->fields[‘amount’] , $format_number );

$rsu->MoveNext();
$xlsrow += 1;
}

// ファイルを送信します
$workbook->close();
—————————————————————————————-