2014-12-29 70 views
2
$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文件

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

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

+0

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

回答

0

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

添加目标= _blank在你的Ajax成功功能类似下面

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

在成功与my_url在新窗口打开。

0

你实际上并不需要Ajax。

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

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

对于下面的第一个评论:

也许尝试更换:

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

readfile ($file_name);

+0

你能给我一些提示或例子吗? – Sadikhasan

+0

我实现了'readfile($ file_name);'但不给我提示。 – Sadikhasan

0

你为什么不只是重定向到下载的Excel文件,当您单击该页面按钮

+0

我不想刷新页面,这就是为什么我使用ajax调用。 – Sadikhasan

+0

然后只需使用而不是 – Beginner

+0

我不想打开新的选项卡或窗口只是想在成功响应时下载弹出窗口。 – Sadikhasan

0

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(); 
}); 
+0

不知道为什么这会得到downvoted,我设法解决我的问题,使用这种方法,所以谢谢你和我+1。 – Magnetize