PHPExcel 下载文件

Posted

技术标签:

【中文标题】PHPExcel 下载文件【英文标题】:PHPExcel download file 【发布时间】:2015-05-15 11:24:37 【问题描述】:

我想下载一个使用 phpExcel 生成的 excel 文件。我按照PHPExcel Force Download Issue 的代码进行操作,但无济于事。在我记录数据接收后,我的控制台只显示这些符号...但是,当我将 $objWriter->save('php://output'); 更改为 $objWriter->save('filename.xlsx'); 时,它只是将文件下载到我的 Web 服务器的根文件夹中,而没有任何迹象表明下载了文件。下面是我的 php 文件的代码 sn-p

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

?>

这是我的 angularjs 代码 sn-p:

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

注意:我使用 AngularJS $http.post 来调用 php 文件。

浏览器:谷歌浏览器

编辑:我尝试了 PHPExcel 01simple-download-xlsx.php 中的示例 php 代码,结果也相同。

更新:我通过接受 Excel 作为响应来搜索有关获取 AngularJS 的方法找到了一些解决方案,但下载后,该文件似乎被乱码文本或符号损坏,类似于在我的安慰。除此之外,文件名是随机文本和数字,而不是我在我的 php 代码中分配的文件名。代码如下:

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

【问题讨论】:

添加标题:***.com/questions/8566196/phpexcel-to-download 已经试过了。您可以在我的问题代码中看到它们。 那个“乱码” Excel 文件.... xls 和 xlsx 都是二进制格式.... angular 不知道如何处理内容类型为 application/vnd.ms-excelapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet 的原始二进制流 是的。我还发现它实际上是excel文件。感谢您指出 angular 不知道如何处理内容类型为 application/vnd.ms-excelapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet 的原始二进制流。将尝试搜索解决该问题。 【参考方案1】:

我找到了一个使用 AngularJS 下载的解决方案,它能够即时更改文件名。我们需要下载 FileSave.js 并包含在 index.html 的标题中。代码sn-p如下:

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文件同问题,只需要在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);

注意:仅适用于支持 HTML5 的浏览器。

【讨论】:

这对我来说效果很好,谢谢!如果我可以补充的话,应该在header('Content-Length: ' . filesize($filename));之前调用$objWriter-&gt;save($filename);这一行【参考方案2】:

你的根文件夹中有excel文件吗?

所以,我认为您可以使用header('Location: path to your excel file'); 这应该可以帮助您下​​载文件。


$objWriter-&gt;save('filename.xlsx');之后还有一个选项加echo json_encode(readfile($file));

在 Angular 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);
    )

并将您的 header('Content-Type: application/vnd.ms-excel'); 设置为 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

试试这个。

【讨论】:

我可以知道该放在哪里吗? $objWriter-&gt;save('filename.xlsx');之后 试过了。控制台仍然会注销乱码文本和符号。如果我删除了您提到的标题,则不会出现乱码文本和符号,只是该文件已保存到我的服务器根文件夹中。编辑:我想知道这是否是 AngularJS 问题。嗯…… 你能把header('Location: path to your excel file');的代码替换成你的实际路径吗? 我已经尝试了您编辑的解决方案。我的代码是echo json_encode(readfile('filename.xlsx')); 您所说的blob 函数中的类型返回损坏的xlsx 文件,如果我将其更改为vnd.ms-excel,我可以打开该文件,但内容是乱码。【参考方案3】:

我有一个非常基本的解决方案,我在我的网站中使用。希望这行得通。

创建一个超链接并将 href 设置为您的 excel 文件并使用下载属性。

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

当您单击此链接时,文件将开始下载。

【讨论】:

不错!如果我仍然找不到任何解决方案,那将是我的项目的一种解决方法。我只需要先将文件生成到我的服务器,然后单击链接下载文件,而不是即时生成并在之后下载(这是我现在的问题的问题)。无论如何,谢谢你的提示。 :)

以上是关于PHPExcel 下载文件的主要内容,如果未能解决你的问题,请参考以下文章

PHPExcel - 读取下载的 xlsx 文件

使用phpexcel上传下载excel文件

PHPExcel读取excel文件示例

phpexcel导入

使用phpexcel类读写excel文件

PHPExcel下载文件在实时服务器中提供错误,因为文件扩展名不正确