2011-04-20 86 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。