简体   繁体   中英

PHPExcel download file

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.

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. 我找到了一些解决方案,通过接受Excel作为响应来搜索获取AngularJS但是在下载之后,似乎文件被乱码文本或符号类似于在我的控制台中注销的文件。 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);

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.

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.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM