0
$workbook = new PHPExcel();
$workbook->createSheet()->setTitle('whatt')->setCellValue( 'A1', 'Another sheet' );
$workbook->createSheet()->setTitle('whatt')->setCellValue( 'A1', 'Another sheet' );
$objWriter = new PHPExcel_Writer_Excel2007($workbook);
$objWriter->setOffice2003Compatibility(true);

ob_start();
$objWriter->save( "php://output" );
$contents = ob_get_contents();
ob_end_clean();



// required for IE, otherwise Content-disposition is ignored
if(ini_get('zlib.output_compression'))
  ini_set('zlib.output_compression', 'Off');

$size = count($contents);

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header('Content-Type: application/vnd.msexcel; charset=utf-8');
header("Content-Disposition: attachment; filename=\"test.xlsx\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: {$size}");
echo $contents;
exit;

createSheetシートをダウンロードすると、1バイトになります。最初のセルが「P」であるシートが1つあります(ファイルにはその文字しか含まれていないため)。2行目をコメントアウトすると、完全に機能します。何か案が?

編集

私は、PHPExcelのせいではなく、そうではなかったという以下の答えを受け入れました。テストとして、ヘッダーを削除して出力バッファリングを維持しても、引き続き機能します。

ob_start();
$objWriter->save( "php://output" );
$contents = ob_get_contents();
ob_end_clean();

file_put_contents( "/mypath/uploads/test.xlsx", $contents );

ファイルは問題なくダウンロードできます。これは、ヘッダーがどういうわけかそれを台無しにしていると私に信じさせます。これは、createSheetを1回だけ使用した場合でも問題がないことを考えると、非常に奇妙です。私がそれを理解するとき、私はそれをここに投稿すると思います。

...。

そして、なぜヘッダーがそれを台無しにしていたのかを理解しました。どうやらcount($contents)1枚のシートを追加して使用するのは問題ありませんでしたが、2枚のシートを追加すると戻るだけでした1。に変更してstrlen($contents)動作しました。なぜそれが起こったのか誰かが教えてくれればボーナスポイント:)

4

1 に答える 1

0

多くのデバッグなしではわかりません。冗長な出力バッファリングを取り除くと、機能します。これが問題の原因であり、PHPExcelでは何も起こりません。では、その後$ contentsで何をしているのでしょうか?

createSheet()を2回続けて呼び出しても、何も破損しません。とにかく、同じタイトルの2つのワークシートを含むブックを作成しようとしているのはなぜですか。PHPExcelは、問題を回避するために、実際には2番目に追加されたワークシートの名前をwhatt2に変更します。

于 2012-06-06T06:40:29.747 に答える