2014-12-29 73 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