【问题标题】:Download excel file with ajax call使用ajax调用下载excel文件
【发布时间】:2014-12-29 08:14:10
【问题描述】:
$objPHPExcel = new PHPExcel();
$objPHPExcel->getActiveSheet()->setTitle('TestMessages');
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment; filename=test_form_".date("Y-m-d_H:i:s").".xls");
// 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调用,并提示用户下载。

我参考Passing data from PHP class to PHPExcel via AJAX但不明白如何实现我的目标?

【问题讨论】:

  • 您可以在页面中添加隐藏的 iframe。当 ajax 调用返回创建数据的 url 时,使用 javascript 将 iframe 重定向到自动触发下载操作的 url。

标签: php jquery ajax phpexcel


【解决方案1】:

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。
【解决方案2】:

我通过以下方式解决了我的问题。

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

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

成功后使用 my_url 打开新窗口。

【讨论】:

    【解决方案3】:

    点击按钮时为什么不直接重定向到下载excel文件的页面

    【讨论】:

    • 我不想刷新页面,这就是我使用 ajax 调用的原因。
    • 那么就用 代替
    • 我不想打开新标签或窗口,只想下载成功响应的弹出窗口。
    【解决方案4】:

    您实际上并不需要 Ajax。

    使用javascript的window.location.replace()如果你得到一个发送文件的url,它会提示下载而不重定向浏览器。

    如果您需要发布数据,您可以创建一个隐藏表单,并按照您需要的方式设置字段,确保表单的“目标”属性设置为"_BLANK",然后提交表单以编程方式。

    下面的第一条评论:

    也许尝试替换:

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('php://output'); 
    

    readfile ($file_name);

    【讨论】:

    • 你能给我一些提示或例子吗?
    • 我实现了readfile ($file_name);,但没有给我提示。
    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2014-12-08
    • 2022-10-12
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多