2015-03-13 18 views
5

Ich wollte eine Excel-Datei herunterladen, die mit PHPExcel erstellt wurde. Ich folgte dem Code von PHPExcel Force Download Issue und vergeblich. Nachdem ich den Datenempfang protokolliert habe, zeigt meine Konsole nur voll von diesen Symbolen. Wenn ich jedoch die $objWriter->save('php://output'); zu $objWriter->save('filename.xlsx'); ändere, dann lade ich einfach die Datei in meinen Stammordner auf meinem Webserver herunter, ohne einen Hinweis darauf zu haben, eine Datei herunterzuladen. Unten ist der Code-Snippet für meine PHP-DateiPHPExcel Download-Datei

<?php 
$con = mysqli_connect('localhost', 'root', '', 'test'); 
mysqli_select_db($con, 'test'); 

$qry = "SELECT * FROM lostitem"; 
$res = mysqli_query($con, $qry); 

require_once '/Classes/PHPExcel.php'; 
include '/Classes/PHPExcel/Writer/Excel2007.php'; 

// Create new PHPExcel object 
$objPHPExcel = new PHPExcel(); 
/** Determine filename **/ 
$filename = "report.xlsx"; 

/** Set header information **/ 
header('Content-Type: application/vnd.ms-excel'); 
header('Content-Disposition: attachment;filename="' . $filename . '"'); 
header('Cache-Control: max-age=0'); 
$F=$objPHPExcel->getActiveSheet(); 
$Line=1; 
$F->setCellValue('A'.$Line, 'Lost Item ID'); 
$F->setCellValue('B'.$Line, 'Lost Item Title'); 
$F->setCellValue('C'.$Line, 'Lost Item Description'); 
while($Trs=mysqli_fetch_assoc($res)){//extract each record 
    ++$Line; 
    $F->setCellValue('A'.$Line, $Trs['LostItemID']); 
    $F->setCellValue('B'.$Line, $Trs['LostItemTitle']); 
    $F->setCellValue('C'.$Line, $Trs['LostItemDescription']);//write in the sheet 
    //++$Line; 
} 
// Redirect output to a client’s web browser (Excel5) 
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment;filename="'.$filename.'"'); 
header('Cache-Control: max-age=0'); 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
$objWriter->save('php://output'); 
exit; 

?> 

Hier ist mein AngularJS Code-Schnipsel:

$scope.getReport = function(type){ 
     if(type == 'lost'){ 
      $http.post("getLostItemReport.php") 
       .success(function(data, status, headers, config){ 
        console.log("Get report data: " + data); 
       }) 
     } 
     } 

Hinweis: Ich verwende AngularJS $ http.post die PHP-Datei aufzurufen.

Browser: Google Chrome

EDIT: Ich habe die Probe PHP-Code von PHPExcel 01simple-Download-xlsx.php und das Ergebnis auch gleiche versucht.

UPDATE: ich eine Lösung, die durch die Suche über AngularJS bekommen durch die Annahme Excel als eine Antwort gefunden habe, aber nach dem Download es, die Datei scheint mit Kauderwelsch Text oder Symbolen ähnlich den beschädigt ist, die in abmeldet meiner Konsole. Außerdem ist der Dateiname ein zufälliger Text und Zahlen anstelle des Dateinamens, den ich in meinem PHP-Code zugewiesen habe. Der Code ist wie folgt:

var blob = new Blob([data], {type: "application/vnd.ms-excel"}); 
        var objectUrl = URL.createObjectURL(blob); 
+0

Header hinzufügen: http://stackoverflow.com/questions/8566196/phexcel-to-download –

+0

Bereits versucht, dass. Sie können sie in meinem Code in den Fragen sehen. – imationyj

+1

Das "Kauderwelsch" ___ist___ die Excel-Datei .... Sowohl xls als auch xlsx sind binäre Formate .... und eckig hat keine Ahnung, was man mit einem rohen binären Stream mit einem Inhaltstyp von 'application/vnd.ms-excel tun soll 'oder' application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' –

Antwort

2

Ich habe eine Lösung zum Herunterladen mit AngularJS mit der Fähigkeit gefunden, den Dateinamen im laufenden Betrieb zu ändern. Wir müssen FileSave.js herunterladen und in den Header von index.html aufnehmen. Der Code-Snippet ist wie folgt:

main.js

$scope.fetchReport = function(){ 
      $http({ 
       url: 'path_to_php_file', 
       method: 'POST', 
       responseType: 'arraybuffer', 
       headers: { 
        'Content-type': 'application/json', 
        'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
       } 
      }).success(function(data){ 
       var blob = new Blob([data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}); 
       saveAs(blob, file_name_to_be+'.xlsx'); 
      }).error(function(){ 
       //Some error log 
      }); 
     } 

Index.html

<button class="btn btn-primary" ng-click="fetchReport()">Get Report</button> 

PHP-Datei wie in der Frage gleich ist, müssen nur ein paar Zeilen vor exit;

header('Content-disposition: attachment; filename='.$filename); 
header('Content-Length: ' . filesize($filename)); 
header('Content-Transfer-Encoding: binary'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 

//Replace php://output with $filename and add code below after that(before exit;) 
readfile($filename); 

Nachricht hinzuzufügen: Es ist nur für HTML5 Browser suppported.

+0

Das hat gut für mich funktioniert, danke! Wenn ich hinzufügen kann, sollte die Zeile '$ objWriter-> save ($ filename);' vor 'header ('Content-Length:'. Filesize ($ filename));' –

1

Sie haben die Excel-Datei in Ihrem Stammordner richtig?

Also, ich denke, Sie können header('Location: path to your excel file'); verwenden Dies sollte Ihnen helfen, die Datei herunterladen.


Es gibt eine andere Option nach $objWriter->save('filename.xlsx');echo json_encode(readfile($file));

in js

$scope.getReport = function (type) { 
if (type == 'lost') { 
    $http({ 
     url: 'getLostItemReport.php', 
     method: 'POST', 
     responseType: 'arraybuffer', 
     headers: { 
      'Content-type': 'application/json', 
      'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
     } 
    }) 
    .success(function (data, status, headers, config) { 
     var blob = new Blob([data], { 
      type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
     }); 
     var objectUrl = URL.createObjectURL(blob); 
     window.open(objectUrl); 
    }) 
} 

Verwendung Code Winkel hinzufügen und Ihre header('Content-Type: application/vnd.ms-excel');-header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

versuchen diese.

+0

Darf ich wissen, wo sollte das hin? – imationyj

+0

nach '$ objWriter-> save ('filename.xlsx');' – itssajan

+0

Versuchte es. Die Konsole loggt immer noch Text und Symbole aus. Wenn ich den Header entferne, den du erwähnt hast, dann gibt es keinen Kauderwelschtext und Symbole, nur dass die Datei in meinem Server-Stammordner gespeichert ist. EDIT: Ich frage mich, ob es das AngularJS-Problem ist oder nicht. hmm ... – imationyj

1

Ich habe eine sehr einfache Lösung, die ich in meiner Website verwende. Hoffe, das funktioniert.

Erstellen Sie einen Hyperlink und legen Sie die href zu Ihrer Excel-Datei und verwenden Sie Download-Attribut.

<a href='file to excel' download='download'>Download Excel File</a> 

Wenn Sie auf diesen Link klicken, wird die Datei heruntergeladen.

+0

Schön! Das wäre ein Workaround für mein Projekt, wenn ich immer noch keine Lösung dafür finden könnte. Ich muss nur zuerst die Datei auf meinem Server generieren und auf den Link klicken, um die Datei herunterzuladen, anstatt sie im laufenden Betrieb zu generieren und anschließend herunterzuladen (was das Problem für meine Frage jetzt ist). Wie auch immer, danke für die Tipps. :) – imationyj