phpexcel zum herunterladen


79

Hallo, ich bin neu bei phpexcel und habe mich gefragt, ob es eine Möglichkeit gibt, das von mir erstellte Excel an den Client-Download zu senden, ohne es auf meinem Server zu speichern oder es direkt nach dem Herunterladen zu löschen

Ich versuche, eine "Export-Schaltfläche" auf einer Seite zu erstellen, die dem Benutzer ein "Popup" mit dem Excel gibt, das er gerade erstellt haben möchte.

Jetzt, nachdem ich die Tabelle erstellt habe, mache ich:

$objXLS->getActiveSheet()->getColumnDimension("A")->setAutoSize(true);
$objXLS->getActiveSheet()->getColumnDimension("B")->setAutoSize(true);

$objXLS->getActiveSheet()->setTitle('Test Stats');

$objXLS->setActiveSheetIndex(0);

$objWriter = PHPExcel_IOFactory::createWriter($objXLS, 'Excel5');
$objWriter->save(__DIR__."/test1.xls");

aber das speichert es auf meinem Server

Vielen Dank

Antworten:


169

Speichern Sie es in einer Datei, anstatt es in einer Datei zu php://outputspeichern :

$objWriter->save('php://output');

Dadurch wird es wie besehen an den Browser gesendet.

Sie wollen einige hinzufügen Header Docs zuerst, wie es üblich mit Datei - Downloads, so dass der Browser weiß , welche Art diese Datei ist und wie er (der Dateiname) genannt werden:

// We'll be outputting an excel file
header('Content-type: application/vnd.ms-excel');

// It will be called file.xls
header('Content-Disposition: attachment; filename="file.xls"');

// Write file to the browser
$objWriter->save('php://output');

Machen Sie zuerst die Header, dann das Speichern. Zu den Excel-Headern siehe auch die folgende Frage: Festlegen des MIME-Typs für das Excel-Dokument .


1
Ich bekomme eine Datei zum Herunterladen, aber es ist nicht das, was ich erstellt habe und wenn ich $ objWriter-> save ('php: // output') mache, bringt es meine ganze Seite durcheinander = \
Dvir Levy

1
Achten Sie darauf, dass Sie auf dieser Seite nur die Ausgabe der beiden headerZeilen und die ->save()Aktion ausgeben . Sie müssen sich entscheiden zwischen a) Anzeigen einer Seite oder b) Anbieten eines Downloads. Beides funktioniert nicht einfach mit einem Skript. Sie können jedoch ein Skript für den Download und eines für die Seite erstellen. Wenn das Seitenskript ausgeführt wurde, leiten Sie zum Download-Skript um, wodurch der Browser den Dialog zum Speichern unter anbietet.
hakre

Mein Problem ist, dass ich Joomla verwende und keinen Weg finde, es von einer leeren Seite zu laden. Jedes Mal, wenn ich es versuche, bekomme ich die Joomla-Seite mit Menüs und allem. Weißt du, wo ich eine Antwort auf dieses Problem finden könnte? Ich möchte nicht Spam-Stack-Überlauf ...
Dvir Levy

Dvir - benutze & format = raw in deiner URL. Erstellen Sie in Ihrem MVC eine view.raw.php-Datei.
MSD

1
Wie können Sie den Content-LengthHeader bei der Verwendung festlegen php://output?
Tonix

22
$excel = new PHPExcel();
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="your_name.xls"');
header('Cache-Control: max-age=0');

// Do your stuff here

$writer = PHPExcel_IOFactory::createWriter($excel, 'Excel5');

// This line will force the file to download
$writer->save('php://output');

Hallo und danke für die Antwort. ich setze die Zeile $ writer-> save ('php: // output'); und es lädt nicht die Datei herunter, die Müll auf der Seite druckt. Weißt du warum das passiert?
Dvir Levy

Haben Sie auch die Header gesetzt?
Matino

Ich versuche, eine PPT mit PHPPowerpoint zu erstellen, habe genau die genannten Schritte ausgeführt, aber wenn ich den MIMETyp in ändere, application/vnd.openxmlformats-officedocument.presentationml.presentationwird die Datei auf mein System heruntergeladen, aber das wird gesagt File can't be opened. Die Datei funktionierte, als der Code sie auf den Server schrieb.
nichtig

Hat für mich perfekt funktioniert. Danke ¡
Jam

6

FÜR XLSX-GEBRAUCH

SET IN $ xlsName Name von XLSX mit Erweiterung. Beispiel: $ xlsName = 'teste.xlsx';

$objPHPExcel = new PHPExcel();

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$xlsName.'"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');

FÜR XLS-GEBRAUCH

SET IN $ xlsName Name von XLS mit Erweiterung. Beispiel: $ xlsName = 'teste.xls';

$objPHPExcel = new PHPExcel();

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$xlsName.'"');
header('Cache-Control: max-age=0');
$objWriter->save('php://output');

3
PSI.: Das XLS-Format ist standardmäßig "Excel5" und XLSX ist "Excel2007".
Rogerio de Moraes

Ich versuche, eine PPT mit PHPPowerpoint zu erstellen, habe genau die genannten Schritte ausgeführt, aber wenn ich den MIMETyp in ändere, application/vnd.openxmlformats-officedocument.presentationml.presentationwird die Datei auf mein System heruntergeladen, aber das wird gesagt File can't be opened. Die Datei funktionierte, als der Code sie auf den Server schrieb.
nichtig

Der Inhaltstyp für xlsx sollte lauten: "application / vnd.openxmlformats-officedocument.spreadsheetml.sheet". Siehe filext.com/faq/office_mime_types.php
kojow7

5

Verwenden Sie diesen Anruf

$objWriter->save('php://output');

Um das XLS-Blatt auf der Seite auszugeben, auf der Sie sich befinden, stellen Sie einfach sicher, dass die Seite, auf der Sie sich befinden, keine anderen Echos, Ausdrucke und Ausgaben hat.


Bei der Arbeit mit Shared Hosting wird bei Verwendung von $ objWriter-> save ('php: // output') eine Fehlermeldung angezeigt (möglicherweise im Zusammenhang mit Datei- und Ordnerberechtigungen). Nicht erfasste Ausnahme 'PHPExcel_Writer_Exception' mit der Meldung 'php: // Ausgabe konnte nicht zum Schreiben geöffnet werden.' in Drittanbieter / PHPExcel / Writer / Excel2007.php: 241 Stapelverfolgung: # 0
Enrique

Ich versuche, eine PPT mit PHPPowerpoint zu erstellen, habe genau die genannten Schritte ausgeführt, aber wenn ich den MIMETyp in ändere, application/vnd.openxmlformats-officedocument.presentationml.presentationwird die Datei auf mein System heruntergeladen, aber das wird gesagt File can't be opened. Die Datei funktionierte, als der Code sie auf den Server schrieb.
nichtig

3
 header('Content-type: application/vnd.ms-excel');

 header('Content-Disposition: attachment; filename="file.xlsx"');

 header('Cache-Control: max-age=0');

 header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

 header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');

 header ('Cache-Control: cache, must-revalidate');

 header ('Pragma: public');

 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');

 $objWriter->save('php://output');

Ich versuche, eine PPT mit PHPPowerpoint zu erstellen, habe genau die genannten Schritte ausgeführt, aber wenn ich den MIMETyp in ändere, application/vnd.openxmlformats-officedocument.presentationml.presentationwird die Datei auf mein System heruntergeladen, aber das wird gesagt File can't be opened. Die Datei funktionierte, als der Code sie auf den Server schrieb.
nichtig

3

Möglicherweise haben Sie Ihr Problem bereits gelöst. Ich hoffe, dies hilft Ihnen.

Alle heruntergeladenen Dateien beginnen mit einer leeren Zeile, in meinem Fall mit vier leeren Zeilen, und es entsteht ein Problem. Egal, ob Sie mit readfile();oder arbeiten save('php://output');, dies kann durch Hinzufügen ob_start();am Anfang des Skripts und ob_end_clean();kurz vor dem readfile(); oder save('php://output');.


Das Problem, das Sie haben, ist die Fehlerprotokollierung und -meldung: Sie sehen keine Warnungen, die Sie auf das Problem hingewiesen hätten: bereits gesendete Header. Dies wird in dieser Referenzfrage umrissen: stackoverflow.com/q/8028957/367456
hakre

2
ob_end_clean()notod_end_clean()
turson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.