2012-02-27 16 views

risposta

42

È possibile utilizzare un writer per salvare su disco o salvare su php: // output. In quest'ultimo caso, è possibile utilizzare il buffering dell'output per acquisire quell'output e quindi archiviarlo in una variabile .... non sono sicuro del perché si vorrebbe farlo.

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

Grazie. Se sto usando questo in un framework come symfony, potrei aver bisogno di passare il contenuto da un servizio Excel ad un tipo di servizio o controller di output. Preferirei evitare il colpo di scrivere su disco. – Aaron

+5

Ti rendi conto che potrebbe essere incredibilmente affamato di memoria, tenendo l'intero file nella memoria di PHP –

+0

Una domanda equa. Grazie per il consiglio. – Aaron

0

Dal PHPExcel scrive il file sul disco, in ogni caso, se si cattura stdout, ciò che accade internamente è che il file viene scritto sul disco, quindi leggere dal disco (e cancellata), stampato sullo standard output e quindi catturato nel buffer di output.

Si potrebbe anche fare:

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

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

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

Questa è una sorta di buon senso su come avvicinarsi a questo, ma ci sono molti aspetti negativi di questo metodo .. La creazione/utilizzo del disco che richiede più operazioni/tempo/spazio. Se questo script viene eseguito in più istanze o sovrapposizioni, è necessario generare un file diverso per istanza. Questo può portare a problemi di corruzione/accesso. L'OP aveva detto direttamente a una variabile, non a un file quindi a una variabile. – Mayhem

+0

La risposta già risolve questi aspetti negativi. 'tempnam' crea un file diverso per istanza, e dal momento che PHPExcel usa un file in ogni caso, è l'approccio apparentemente" da semplice a variabile "che è il meno efficiente dei due. In molti casi, sarebbe possibile utilizzare 'readfile' o la gestione dei flussi per aggirare i problemi di memoria e aumentare ulteriormente le prestazioni. Mentre la risposta accettata sembra essere più semplice, che è di per sé preziosa, sento ancora che * questa * dovrebbe essere la risposta accettata, o un'alternativa credibile. – LSerni

Problemi correlati