【问题标题】:jqGrid Export to CSV - Post Rather than GetjqGrid 导出到 CSV - 发布而不是获取
【发布时间】:2011-08-09 02:55:52
【问题描述】:

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

问题是,excelExport 使用 GET 来发送数据,我仍然需要它是 POST。我查看了代码并尝试了几种方法来设置 excelExport 以通过 POST 发送其请求,但没有成功。

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

【问题讨论】:

  • 如果你打算奖励赏金,你应该明确地这样做(请参阅“我如何奖励赏金?”here 了解详细信息)
  • 谢谢,奥列格。当我接受答案时,我以为它已被授予。
  • 不客气!我理解你,正因为如此,我向你发布了描述赏金如何真正发挥作用的参考资料。

标签: jquery jqgrid


【解决方案1】:

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

通过 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包含。如果它打开新的 url(per HTTP GET !!!)它将使用相应的应用程序,如 Excel 来显示它。

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

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

【讨论】:

    【解决方案2】:

    艾米, 我有同样的问题。 我不是程序员(您会通过我将在此处粘贴的代码意识到这一点 :))但我找到的解决方案似乎工作正常。

    这是我对另一个类似问题(与 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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      相关资源
      最近更新 更多