【问题标题】:PHPExcel download using ajax callPHPExcel下载使用ajax调用
【发布时间】:2014-12-30 08:30:18
【问题描述】:
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调用,并提示用户下载。

【问题讨论】:

    标签: 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();
    });
    

    【讨论】:

    • 棒棒的小伙伴..你节省了我很多时间..继续努力...(y)
    • 不幸的是,这对我不起作用。对我有用的只是将 window.location 设置为 done 回调中的端点 url。
    • 搜索后这是对我有用的最佳答案,因为我可以处理错误消息并简单地为更大的文件创建等待指示器(或消息)。 window.location 不足以进行错误处理,带有下载属性的 难以实现等待指示器。所以谢谢分享!!! :) (我只是在没有数组和 json 编码的情况下使用它。)
    • 这在 PHPExcel 中对我有用,但在 phpSpreadSheet(当前 PHPExcel)中不起作用。如果有人知道如何使用 phpSpreadSheet 进行这项工作,我会很高兴。
    【解决方案2】:

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

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

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

    【讨论】:

    • 提前享受新年快乐:)
    • 这可行,但至少在 Chrome 中新窗口被阻止,您必须明确允许打开和下载生成的文件。
    • window.open 的问题是在浏览器上你必须在第一次启用权限。所以我用 window.location 代替了 window.open。
    【解决方案3】:

    出于安全原因,您既不能通过 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>
    

    【讨论】:

    • 成功回调上的window.location对我有用:)
    【解决方案4】:

    我正在尝试在电子表格中做同样的事情,它适用于 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;
    }
    

    【讨论】:

    • 经过多次尝试,我找到了解决方案:\PhpOffice\PhpSpreadsheet\Shared\File::setUseUploadTempDirectory("...");
    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 2015-02-16
    • 2023-04-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多