2012-02-27 1 views

答えて

42

ライターを使用してディスクに保存したり、php://出力に保存することができます。後者の場合は、出力バッファリングを使用してその出力をキャプチャし、変数に格納することができます。なぜこれをやりたいのですか? stdoutに印刷された後、

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
ob_start(); 
$objWriter->save('php://output'); 
$excelOutput = ob_get_clean(); 
+3

感謝を。これをsymfonyのようなフレームワークの中で使用している場合、私はExcelのサービスからいくつかのタイプの出力サービスまたはコントローラにコンテンツを渡す必要があります。私はむしろディスクへの書き込みのヒットを避けるだろう。 – Aaron

+5

ファイル全体をPHPメモリに保持していると、メモリが大量に消費されている可能性があります。 –

+0

公正な質問。アドバイスをいただきありがとうございます。 – Aaron

0

PHPExcelはどのような場合には、ファイルをディスクに書き込みますので、あなたが標準出力をキャプチャした場合、何が内部で発生したファイルがディスクに書き込まれていることで、ディスクから読み取る(および削除)、出力バッファに取り込まれます。

あなたにも行う可能性があります:

$tmpfile = tempnam($tmp_dir, 'phpxltmp'); 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
$objWriter->save($tmpfile); 

$excelOutput = file_get_contents($tmpfile); 
unlink($tmpfile); 
+2

これは、これに近づく方法の常識のようなものですが、この方法には多くの弱点があります.. あなたの作成/使用にはより多くの操作/時間/スペースが必要です。 このスクリプトを複数のインスタンスまたは重複で実行する場合、インスタンスごとに異なるファイルを生成する必要があります。これは、腐敗/厄介な問題につながる可能性があります。 OPは、ファイルにではなく変数に直接言いました。 – Mayhem

+0

答えはすでにこれらの欠点を解決しています。 'tempnam'はインスタンスごとに異なるファイルを作成し、PHPExcelはどのような場合でもファイルを使用するので、2つの方法の効率が低いのは明らかに「まっすぐ変わる」アプローチです。多くの場合、 'readfile'やストリーム処理を使用してメモリの問題を回避し、さらにパフォーマンスを向上させることが可能です。受け入れられた答えはより直接的であるように見えますが、これはそれ自体にとって貴重ですが、私はまだこれが受け入れられた答え、または信頼できる代替物であるべきであると感じています。 – LSerni

関連する問題