使用ajax调用下载PHPExcel

时间:2014-12-30 08:30:18

标签: php jquery ajax phpexcel

App::import('Vendor', 'PHPExcel/Classes/PHPExcel');
$objPHPExcel = new PHPExcel();
$objPHPExcel->getActiveSheet()->setTitle('ReceivedMessages');
header('Content-Type: application/vnd.ms-excel');
$file_name = "kpi_form_".date("Y-m-d_H:i:s").".xls";
header("Content-Disposition: attachment; filename=$file_name");
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');

当我直接从浏览器调用上面的代码时,会下载结果文件。但是如果我对上面的代码进行ajax调用,我就不会得到下载提示。我可以从控制台选项卡中看到ajax调用已成功完成,并在响应数据中看到一堆随机字符。我假设那是excel对象。

有谁知道如何使用ajax实现下载excel功能?我不想刷新页面。当用户点击“导出”按钮时,应该对php文件进行ajax调用并提示用户下载。

4 个答案:

答案 0 :(得分:39)

PHP

$objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
ob_start();
$objWriter->save("php://output");
$xlsData = ob_get_contents();
ob_end_clean();

$response =  array(
        'op' => 'ok',
        'file' => "data:application/vnd.ms-excel;base64,".base64_encode($xlsData)
    );

die(json_encode($response));

JS

$.ajax({
    type:'POST',
    url:"MY_URL.php",
    data: {},
    dataType:'json'
}).done(function(data){
    var $a = $("<a>");
    $a.attr("href",data.file);
    $("body").append($a);
    $a.attr("download","file.xls");
    $a[0].click();
    $a.remove();
});

答案 1 :(得分:10)

在你的ajax成功函数中添加target = _blank,如下所示

success: function(){
  window.open('http://YOUR_URL','_blank' );
},

否则,您可以巧妙地处理使用jQuery触发器功能等在新选项卡中打开Excel下载链接。

答案 2 :(得分:6)

由于安全原因,您无法使用phpexcel或php本身使用ajax下载文件,而且几乎浏览器都不支持它。 但是,您可以尝试使用window.location成功回调,例如,

var page='mydownload.php';
$.ajax({
    url: page,
    type: 'POST',
    success: function() {
        window.location = page;// you can use window.open also
    }
});

同样@freakish answered这类问题

即便如此,您也不需要ajax,您可以使用页面的超链接,

<a href="mydownload.php" target="_blank" >Download</a>

答案 3 :(得分:1)

我正在尝试在电子表格中执行相同的操作,并且它对xls文件非常有效,但对mpdf文件却不起作用

IOFactory::registerWriter('Pdf', $this->classNamePdf);
ob_start();
IOFactory::createWriter($this->exportType, 'Pdf')->save('php://output');
$pdfData = ob_get_contents();
ob_end_clean();

return "data:application/pdf; base64,".base64_encode($pdfData);

success: function(response){
    var win = window.open("", "_blank");
    win.location.href = response;
}