PHPExcel download file

冷暖自知 提交于 2019-12-22 06:11:15

问题


I wanted to download an excel file generated by using PHPExcel. I followed the code from PHPExcel Force Download Issue and to no avail. After I log the data receive, my console only shows full of these symbols �.However, when I change the $objWriter->save('php://output'); to $objWriter->save('filename.xlsx'); then it just download the file to my root folder in my web server without any indication of downloading a file. Below is the code snippet for my php file

<?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;

?>

Here is my angularjs code snippet:

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

Note: I'm using AngularJS $http.post to call the php file.

Browser: Google Chrome

EDIT: I have tried the sample php code from PHPExcel 01simple-download-xlsx.php and the result also same.

UPDATE:I have found some solution by searching about getting AngularJS by accepting Excel as a response but after download it, it seems the file is corrupted with gibberish text or symbols similar to the one that logs out in my console. Besides that, the filename is random text and numbers instead of the filename I assigned in my php code. The code is as below:

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

回答1:


I have found a solution to download using AngularJS with ability to change the filename on the fly. We will need to download FileSave.js and include in the header of index.html. The code snippet is as below:

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 file is same as in the question, just need to add a few lines before 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);

Note: It's only for HTML5 suppported browser.




回答2:


You have the excel file in your root folder right ?

So, I think you can use header('Location: path to your excel file'); This should help you download the file.


There is another option after $objWriter->save('filename.xlsx'); add echo json_encode(readfile($file));

in angular js code use

$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);
    })
}

And set your header('Content-Type: application/vnd.ms-excel'); to header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

Try this one.




回答3:


I have a very basic solution which i use in my website. Hope this works.

Create a hyperlink and set the href to your excel file and use download attribute.

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

When You click this link the file would start downloading.



来源:https://stackoverflow.com/questions/29024445/phpexcel-download-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!