【问题标题】:Export jqgrid filtered data as excel or CSV将 jqgrid 过滤后的数据导出为 excel 或 CSV
【发布时间】:2012-01-03 21:38:08
【问题描述】:

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

【问题讨论】:

    标签: servlets jqgrid


    【解决方案1】:

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

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

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

    如果您不使用multipleSearch: true 选项,您将无法使用复杂过滤器,有关过滤器的信息将放置在postData 参数的三个属性中:searchFieldsearchOper 和@ 987654335@.

    【讨论】:

    • 嗨,奥列格,我已经按照您的要求完成了,现在可以正常工作了。我已将您的代码放在自定义导航按钮的 onClickButton 事件中,并且在获取过滤器元素后,我通过 ajax 调用 servlet 方法,该方法提供了 excel 文件。感谢您的回复,这节省了我很多时间。
    • @Bhagwat:我很高兴知道我可以帮助你。不客气!
    • @Oleg:我试过你的答案,但过滤器没有通过。我更新了 Bhagwat 问题并添加了测试用例
    • @Andrus:“过滤器未通过”是什么意思?我只描述了如何获取当前使用的filters,而不是如何将信息传递到某处。此外,我没有看到 Bhagwat 的问题发生了变化,也看不到任何测试用例。你应该更清楚地解释你的意思。
    • @Oleg: 看来通过编辑没有发布,也许等待moderaton。我添加了描述问题的答案。
    【解决方案2】:

    根据 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();
            }
        });
    

    索引.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");
    }
    

    控制器中的过滤器参数具有空值。不知道将过滤器和排序参数传递给 Export 方法的正确方法。

    【讨论】:

    • 为什么不直接使用 jQuery.ajax 将数据发布到服务器?您是否通过alert 验证$("#grid").jqGrid('getGridParam', 'postData') 为您提供了您需要的信息?
    • @Oleg:我需要在单独的选项卡中打开 excel 结果或提示用户下载 xls 文件。 Ajax 不支持这个。alert($("#grid").jqGrid('getGridParam', 'postData').filters) 返回{"groupOp":"AND","rules":[{"field":"Klient_nimi","op":"cn","data":"emil"}]}
    • 我个人在使用window.location的情况下直接设置(见herehere)。例如 window.location = myServerBaseUrl/Export + '?filters=' + encodeURIComponent(filters);onClickButton 内。
    • 谢谢,它成功了。如果导出控制器抛出异常,它将返回错误消息作为 json 内容。在这种情况下,浏览显示“未找到”页面。用户没有看到错误消息。
    • the answer 中,我展示了如何定义类HandleJsonExceptionAttribute 用作[HandleError] 属性的替换。您可以将 Export 操作放在另一个控制器中,并在案例中使用 HTML 而不是 json 内容。您还可以直接在 Export 操作中提供有关错误的 HTML 内容。所以我认为你应该只更改Export 操作中的错误报告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    相关资源
    最近更新 更多