我有一个使用Post发送请求的jqGrid。我有一个php函数,当给定jqGrid搜索和排序设置时,可以返回一个CSV文件。并且,我已经组合了一个外部按钮,可以调用exportExcel以尝试调用该php函数并检索CSV。
问题是,excelExport正在使用GET发送数据,我仍然需要它进行POST。我查看了代码并尝试了几种方法来设置excelExport以通过POST发送请求而没有运气。
所以,问题是:有没有办法让excelExport使用POST,或者是否有一种简单的方法让我发送完全相同的POST请求,如果我将它重新加载到我的php函数,网格将发送该请求可以生成CSV吗?
答案 0 :(得分:7)
在我看来,你想要的是不可能的。我必须更详细地解释我的意思。
根据HTTP POST获取CSV,XLS或XLSX文件不是问题。如果您将使用HTTP POST,则问题是在Excel中显示服务器响应。
excelExport
方法的代码非常简单,您可以看到它here。 excelExport
做的只是打开一个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。