2011-04-20 88 views
1

我有一個使用Post發送請求的jqGrid。我有一個PHP函數,當給定的jqGrid搜索和排序設置可以返回一個CSV文件。而且,我放了一個可以調用exportExcel的外部按鈕,試圖調用該php函數並檢索CSV。jqGrid導出爲CSV - 發佈而不是獲取

問題是,excelExport使用GET發送數據,我仍然需要它POST。我查看了代碼並嘗試了幾種方法設置excelExport通過POST發送請求,但沒有運氣。

所以,問題是:有沒有辦法讓excelExport使用POST,或者是否有一種簡單的方法來發送完全相同的POST請求,如果我將它重新加載到我的PHP函數可以生成CSV?

+0

如果您計劃獎勵賞金,您應該明確地做到這一點(請參閱「如何獎勵賞金?」[詳細信息](http://meta.stackoverflow.com/privileges/set-bounties) – Oleg 2011-04-26 12:04:33

+0

謝謝Oleg。當我接受答案時,我曾假設它被授予。 – 2011-04-26 12:19:26

+0

不客氣!我瞭解你,正因爲如此,我發佈了你的參考資料,描述獎賞真正如何工作。 – Oleg 2011-04-26 12:24:03

回答

7

在我看來,你想要的是不可能的。我必須更詳細地解釋我的意思。

獲取CSV,XLS或XLSX文件包含每個HTTP POST不是問題。如果您使用HTTP POST,問題是在Excel中顯示服務器響應。

代碼excelExport方法很簡單,你可以看到它hereexcelExport所做的只是打開一個URL,其中會添加一些附加參數。代碼的主要部分如下

window.location = url; 

所以所有真正有趣的事情是在服務器上實現。服務器設置一些HTTP標頭很重要,尤其是Content-Type,它將HTTP響應定義爲Excel文件(或者如果不能生成XLSX數據,則將其定義爲CSV)。我個人使用Open XML SDK 2.0生成XLSX文件包含並將"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"設置爲Content-Type。你的情況應該是"text/csv"(見here)。另外,可以使用Content-Disposition HTTP頭來定義響應的首選文件名。例如,您的情況可能是"attachment; filename=test.csv"。因爲你已經有了服務器代碼,所以你可能已經在代碼中實現了所有的東西。

最重要的部分是:網頁瀏覽器知道如何打開不同的URL包含。如果它打開新的URL(每HTTP GET !!!)它將使用相應的應用程序,如Excel來顯示它。

另一方面,如果您使用$.ajax,則可以通過HTTP POST獲取CSV包含的內容,但您希望如何解決下一個問題 - 使用數據啓動Excel?我不知道沒有使用ActiveX控件的簡單解決方案只能在Internet Explorer中工作。

所以我建議你只使用HTTP GET。如果你不想緩存數據,你可以通過設置相應的HTTP頭來完成。在大多數情況下,設置Cache-Control: max-age=0就足夠了。設置Cache-Control: private另外關閉緩存代理上的數據並聲明數據可以被緩存,但不與其他用戶共享。有關該主題的更多信息,請參閱以下Caching Tutorial

1

艾米, 我有同樣的問題。 我不是一個程序員(你會意識到通過代碼我會粘貼在這裏:))但我找到的解決方案似乎工作正常。

這是我對另一個類似問題(與jqGrid無關)的解決方案。

excelExport : function(o) { 
    o = $.extend({ 
     exptype : "remote", 
     url : null, 
     oper: "oper", 
     tag: "excel", 
     exportOptions : {} 
    }, o || {}); 
    return this.each(function(){ 
     if(!this.grid) { return;} 
     if(o.exptype == "remote") { 
      var pdata = $.extend({},this.p.postData); 

      pdata[o.oper] = o.tag; 

      var form = document.createElement("form"); 
      form.setAttribute("method", "post"); 
      form.setAttribute("action", o.url); 
      form.setAttribute("target", "_blank"); 

      $.each(pdata, function(i, l){ 
       if (typeof l != 'undefined') { 
        if (typeof l == 'function') { 
         post_value = l(); 
        } 
        else { 
         post_value = l; 
        } 
        var hiddenField = document.createElement("input"); 
        hiddenField.setAttribute("type", "hidden"); 
        hiddenField.setAttribute("name", i); 
        hiddenField.setAttribute("value", post_value); 
        form.appendChild(hiddenField); 
       } 
      }); 

      document.body.appendChild(form); // Not entirely sure if this is necessary 
      form.submit(); 

     } 
    }); 
} 

正如您所看到的,它會創建一個表單並將數據發佈到新頁面。 這裏的大多數人會發現一個更好(更優雅)的方式來做到這一點,但這個解決方案,就像是,工作。 我需要向服務器發送大量信息,所以GET對我來說不夠用,這就是爲什麼我需要POST數據。

希望這對你有用。

JMG。