2013-06-27 54 views
4

我正在使用PHPExcel讀取excel模板,填充數據並要求用戶下載文件。使用ajax調用下載文件

generate_excel.php

$objPHPExcel = PHPExcel_IOFactory::load("./template.xlsx"); 
//populate data ... 
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment;filename="01simple.xlsx"'); 
header('Cache-Control: max-age=0'); 
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
$objWriter->save('php://output'); 

當我直接從瀏覽器中打開generate_excel.php,結果文件被下載。 但是,如果我調用一個ajax調用generate_excel.php,我沒有得到下載提示。使用Chrome開發人員工具,我可以從Network選項卡看到ajax調用已成功完成,並且在響應數據中可以看到一堆隨機字符。我假設這是excel對象。

有誰知道我如何使用ajax實現下載excel功能?我不想刷新頁面。當用戶點擊「導出」按鈕時,應該對php文件進行ajax調用並提示用戶下載。

謝謝!

+1

我不知道PHP的,但如果它的工作方式相同作爲asp.net,那麼當你有文件返回時,你的頁面實際上不會重新加載。所以,它是否是ajax並不重要。 –

回答

3

找到一種方法來做到這一點,雖然我不知道這是一種理想的方法。

我在頁面中添加了一個隱藏的iframe。當ajax調用返回時,它返回創建的數據的url。我使用JavaScript將iframe重定向到自動觸發下載操作的URL。

4

我不認爲你可以通過ajax調用下載任何東西。而不是你可以生成並保存在服務器(臨時)的Excel和顯示下載鏈接到用戶。

+0

有沒有什麼辦法在服務器上保存文件,並自動在新窗口中打開它? –

6

並非所有事情都應該用AJAX來完成。有時簡單的舊HTML更適合於工作。我猜你的按鈕有a標籤?爲什麼你不會這樣做

<a href="generate_excel.php" target="_blank">Export to Excel</a> 

在你的HTML?請注意0​​部分。它確保您的頁面不會被重新加載。

對於input您可以使用構造

<form action="generate_excel.php" target="_blank"><input type="button">...whatever</form> 
+0

該按鈕是

+0

@JohnNg我認爲你應該真的得到一本關於HTML的好書。 –

+0

我想發送給php的數據來自全局變量。發送此信息的最佳方式是什麼?創建隱藏的輸入元素? –

7

我在尋找方法將帶有ajax的JSON數據傳遞給PHP,並返回一個excel文件(MySQL和PHPExcel)供用戶保存。 我環顧四周,把一些拼在一起,希望它可以幫助別人:

的jQuery:

$("#exportBotton").on("click",function(event) { 
event.preventDefault(); 
// create json object; 
str_json = JSON.stringify({"key01":val01, "key02":val02, "key03":val03}); 
     $.ajax({ 
       type: "post", 
       data: str_json, 
       url: "../../includes/dbSelect_agentFormExport.php", 
       dataType: "json", 
       success: function(output){ 
          // output returned value from PHP t 
       document.location.href =(output.url); 
      } 
     }); 
}); 

PHP:

$str_json = file_get_contents('php://input'); 
$objPHPExcel = new PHPExcel(); 
// here i populated objPHPExcel with mysql query result..... 

function saveExcelToLocalFile($objWriter){ 
    // make sure you have permission to write to directory 
    $filePath = '../tmp/saved_File.xlsx'; 
    $objWriter->save($filePath); 
    return $filePath; 
} 

$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); 
$response = array(
    'success' => true, 
    'url' => saveExcelToLocalFile($objWriter) 
); 
echo json_encode($response); 
exit(); 
+0

我試圖直接從AJAX調用打開Excel,但沒有成功。 有MIME類型的問題 然後我試着將你的文件保存到服務器,並給url的主頁。它直接工作。 你做了我的一天。十分感謝。 – Ydakilux