使用ajax调用下载PHPExcel

使用ajax调用下载PHPExcel,php,jquery,ajax,phpexcel,Php,Jquery,Ajax,Phpexcel,当我直接从浏览器调用上述代码时,结果文件被下载。但是,如果我对上述代码进行ajax调用,就不会得到下载提示。我可以从console选项卡上看到ajax调用已成功完成,并且在响应数据中可以看到一堆随机字符。我假设这是excel对象 有人知道我如何使用ajax实现下载excel功能吗?我不想刷新页面。当用户单击“导出”按钮时,应该会有一个对php文件的ajax调用,并提示用户下载。由于安全原因,phpexcel和php本身都不能使用ajax下载文件,而且几乎所有浏览器都不支持它。 但是,您可以在成功

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


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

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

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,你也可以在页面上使用超链接

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

在ajax成功函数中添加target=\u blank,如下所示

<a href="mydownload.php" target="_blank" >Download</a>
否则,您可以使用jQuery触发器函数等在新选项卡中巧妙地打开Excel下载链接。

PHP

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

$.ajax({
类型:'POST',
url:“MY_url.php”,
数据:{},
数据类型:'json'
}).完成(功能(数据){
变量$a=$(“”);
$a.attr(“href”,data.file);
$(“正文”)。追加($a);
$a.attr(“下载”、“文件.xls”);
$a[0]。单击();
$a.删除();
});

我尝试在电子表格中做同样的事情,它可以很好地处理xls文件,但不能处理mpdf文件

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

伟大的新年快乐提前享受:)这是可行的,但至少在Chrome中,新窗口被阻止,您必须给予明确的权限才能打开和下载生成的文件。window.open的问题是,在浏览器上,您必须第一次启用权限。因此,我用window.location.Awesome bud.代替window.open.你节省了我很多时间..保持下去..很遗憾,这对我不起作用。对我有效的方法是将window.location设置为完成回调中的端点url。搜索后,这是对我有效的最佳答案,因为我可以处理错误消息,只需为较大的文件创建等待指示器(或消息)。window.location不足以进行错误处理,并且具有下载属性很难实现等待指示器。谢谢分享!!!:)(我只是在没有数组和json编码的情况下使用它。)这在phpXcel中对我有效,但在phpSpreadSheet(当前的phpXcel)中不起作用。如果有人知道如何使用phpSpreadSheet.window.location在成功回调中对我起作用,我会很高兴:)我在多次尝试后找到了解决方案:\PhpOffice\phpSpreadSheet\Shared\File::setUseUploadTempDirectory(“…”);
$.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();
});
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;
}