jqGrid导出为CSV - 发布而不是获取

时间:2011-04-20 00:35:53

标签: jquery jqgrid

我有一个使用Post发送请求的jqGrid。我有一个php函数,当给定jqGrid搜索和排序设置时,可以返回一个CSV文件。并且,我已经组合了一个外部按钮,可以调用exportExcel以尝试调用该php函数并检索CSV。

问题是,excelExport正在使用GET发送数据,我仍然需要它进行POST。我查看了代码并尝试了几种方法来设置excelExport以通过POST发送请求而没有运气。

所以,问题是:有没有办法让excelExport使用POST,或者是否有一种简单的方法让我发送完全相同的POST请求,如果我将它重新加载到我的php函数,网格将发送该请求可以生成CSV吗?

2 个答案:

答案 0 :(得分:7)

在我看来,你想要的是不可能的。我必须更详细地解释我的意思。

根据HTTP POST获取CSV,XLS或XLSX文件不是问题。如果您将使用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包含。如果它打开新网址(每HTTP GET !!!),它将使用相应的应用程序(如Excel)来显示它。

另一方面,如果您使用$.ajax,您可以获得每个HTTP POST包含的CSV,但是您希望如何解决下一个问题 - 使用数据启动Excel?如果不使用仅在Internet Explorer中工作的ActiveX控件,我不知道这个简单的解决方案。

所以我建议你只使用HTTP GET。如果您不想缓存数据,可以通过设置相应的HTTP标头来完成此操作。在大多数情况下,Cache-Control: max-age=0的设置就足够了。设置Cache-Control: private还会关闭缓存代理上的数据,并声明数据可以缓存,但不与其他用户共享。有关该主题的更多信息,请参阅以下Caching Tutorial

答案 1 :(得分: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。