使用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("Ym-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实现下载excelfunction? 我不想刷新页面。 当用户点击“导出”按钮时,应该对php文件进行ajax调用并提示用户下载。

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

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

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

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.attr("href",data.file); $("body").append($a); $a.attr("download","file.xls"); $a[0].click(); $a.remove(); }); 

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

 var page='https://stackoverflow.com/questions/27701981/phpexcel-download-using-ajax-call/mydownload.php'; $.ajax({ url: page, type: 'POST', success: function() { window.location = page;// you can use window.open also } }); 

另外@freakish 回答了这类问题

甚至,你不需要ajax你可以使用超链接的页面,如,

 Download