Servlets 将jqgrid筛选数据导出为excel或CSV

Servlets 将jqgrid筛选数据导出为excel或CSV,servlets,jqgrid,Servlets,Jqgrid,我遇到了麻烦,请帮助我。我想在jqgrid的页面中显示“导出到excel”按钮,该按钮将导出当前数据集,该数据集是在搜索jqgrid的条件后检索的(基于当前过滤器)。我正在为我的jqgrid使用“loadonce:true”设置。现在我想在搜索后从jqgrid的本地数据源导出数据。如果这是不可能的,那么当我点击搜索条件需要执行的导航的导出按钮时,我如何能够将参数传递给服务器。我将后端用作servlet 我建议您在服务器上实现数据导出,只需将当前搜索筛选器发布到后端即可。关于搜索参数的完整信息定义

我遇到了麻烦,请帮助我。我想在jqgrid的页面中显示“导出到excel”按钮,该按钮将导出当前数据集,该数据集是在搜索jqgrid的条件后检索的(基于当前过滤器)。我正在为我的jqgrid使用“loadonce:true”设置。现在我想在搜索后从jqgrid的本地数据源导出数据。如果这是不可能的,那么当我点击搜索条件需要执行的导航的导出按钮时,我如何能够将参数传递给服务器。我将后端用作servlet

我建议您在服务器上实现数据导出,只需将当前搜索筛选器发布到后端即可。关于搜索参数的完整信息定义了jqGrid的
postData
参数。jqGrid
search
的另一个布尔参数定义是否应用搜索过滤器。最好忽略
postData
参数的
\u search
属性,并使用jqGrid的
search
参数

有关搜索筛选器的信息格式取决于是否使用used
multipleSearch:true
选项。我个人经常使用它。在这种情况下,有关筛选器的完整信息将放在
postData
参数:
filters
属性的一个属性中。描述了该格式。获取信息的代码如下所示

var $grid = $("#list"),
    isFilterAreUsed = $grid.jqGrid('getGridParam', 'search'),
    filters = $grid.jqGrid('getGridParam', 'postData').filters;

如果不使用
multipleSearch:true
选项,将无法使用复杂筛选器,有关筛选器的信息将放置在
postData
参数的三个属性中:
searchField
searchOper
searchString

根据Oleg答案,可以使用

javascript代码:

$("#grid").jqGrid('navButtonAdd', '#grid_toppager', {
        caption: "Excel",
        buttonicon: "ui-icon-save",
        onClickButton: function () {
            document.forms['_export']._buffer.value = $("#grid").jqGrid('getGridParam', 'postData');
            document.forms['_export'].submit();
        }
    });
Index.aspx:

<form  id='_export' method="post" action='<%= Url.Action( "Export", "Grid", new { _entity= Model.Name } ) %>'>
    <input type="hidden" name="_buffer" id="_buffer" value="" />
    </form>

控制器:

public ActionResult Export(string _entity, string _sidx, string _sord, string filters ) {
            string where = "";
            if (!string.IsNullOrEmpty(filters))
            {
                var serializer = new JavaScriptSerializer();
                Filters filtersList = serializer.Deserialize<Filters>(filters);
                where = filtersList.FilterObjectSet(entity);
            }
            if (string.IsNullOrEmpty(where))
                where = " TRUE ";
            Response.ClearContent();
            Response.AddHeader("content-disposition", "attachment; filename=MyExcelFile.xls");
            Response.ContentType = "application/excel";
            Response.Write(GetAllData(_entity, _sidx, _sord, where));
            Response.End();
            return View("Index");
}
公共操作结果导出(字符串实体、字符串sidx、字符串排序、字符串筛选器){ 字符串,其中=”; 如果(!string.IsNullOrEmpty(筛选器)) { var serializer=新的JavaScriptSerializer(); 过滤器过滤器列表=序列化程序。反序列化(过滤器); 其中=filtersList.FilterObjectSet(实体); } if(string.IsNullOrEmpty(where)) 其中=“TRUE”; Response.ClearContent(); AddHeader(“内容处置”、“附件;文件名=MyExcelFile.xls”); Response.ContentType=“应用程序/excel”; Write(GetAllData(_entity,_sidx,_sord,where)); Response.End(); 返回视图(“索引”); }
控制器中的filters参数具有空值。不知道哪种方法是将过滤器和排序参数传递给导出方法的正确方法。

嗨,Oleg,我已经按照您指定的方式完成了,现在可以使用了。我已经将您的代码放在自定义导航按钮的onClickButton事件中,在获得过滤器元素后,我通过ajax调用servlet方法,该方法提供excel文件。谢谢你的回复,这节省了我很多的时间。@Bhagwat:我很高兴知道我能帮助你。不客气@奥列格:我试过你的答案,但过滤器没有通过。我更新了Bhagwat问题并添加了testcase@Andrus:您在“过滤器未通过”下的意思是什么?我只描述了如何获得当前使用的
过滤器,而不描述如何将信息传递到某个地方。此外,我没有看到Bhagwat的问题被改变,也没有看到任何测试用例。你应该更清楚地解释你的意思。@Oleg:看起来编辑版还没有出版,也许等版主来吧。我添加了描述这个问题的答案。为什么不直接使用jQuery.ajax将数据发布到服务器?您是否使用
警报
验证
$(“#网格”).jqGrid('getGridParam','postData')
获取您需要的信息?@Oleg:我需要在单独的选项卡中打开excel结果,或提示用户下载xls文件。Ajax不支持此功能。
alert($(“#grid”).jqGrid($(“#grid”).filters)
返回
{“groupOp”:“AND”,“rules”:[{“field”:“Klient_nimi”,“op”:“cn”,“data”:“emil”}]}
我个人在直接设置
窗口位置时使用的设置(请参见或)。例如
window.location=myServerBaseUrl/Export+'?filters='+encodeURIComponent(filters)
onClickButton
的内部。谢谢,它起作用了。如果导出控制器抛出excepton,它将返回错误消息作为json内容。在这种情况下,浏览显示“未找到”页面。用户没有看到错误消息。在中,我演示了如何定义类
HandleJsonExceptionAttribute
作为
[HandleError]
属性的替换。您可以在另一个控制器中放置
Export
操作,并在案例中使用HTML而不是json内容。您还可以在
导出
操作中直接提供出错时的HTML内容。因此,我认为您应该更改
导出
操作中的错误报告。