2011-11-22 54 views
2

我有麻烦了,请帮我解决。我想在jqgrid的寻呼机中显示“导出为ex​​cel”按钮,它将导出当前搜索条件后检索的数据集jqgrid(基于当前过滤器)。我为我的jqgrid.Now使用“loadonce:true”设置。现在我想在搜索后从jqgrid的本地数据源导出数据。如果这是不可能的,那么当我点击搜索标准需要做的导航导出按钮时,我怎么能够将参数传递给服务器。我使用后端作为servlet。将jqgrid过滤的数据导出为ex​​cel或CSV

回答

3

我建议您在服务器上实现数据导出,并将当前搜索过滤器发布到后端。有关搜索参数的完整信息定义了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参数的三个属性:searchField,searchOpersearchString

+0

嗨奥列格,我已经完成了你指定的工作,现在正在工作。我已经将你的代码放在我的自定义导航按钮的** onClickButton **事件中,并且在得到过滤器元素后,我通过ajax调用servlet方法,该方法给出了excel文件。感谢您的回复,它节省了我很多时间。 –

+0

@Bhagwat:我很高兴知道我可以帮助你。不用谢! – Oleg

+0

@Oleg:我试过你的答案,但是过滤器没有通过。我更新了Bhagwat问题并添加了测试用例 – Andrus

0

据奥列格回答这个问题,可以使用

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

滤波器参数控制器具有空值。不知道哪种方法可以将过滤器和排序参数传递给Export方法。

+1

为什么不只是使用jQuery.ajax将数据发布到服务器?你用'alert'来验证'$(“#grid”)。jqGrid('getGridParam','postData')'得到你需要的信息吗? – Oleg

+0

@Oleg:我需要在单独的选项卡或提示用户下载xls文件时打开excel结果。 Ajax不支持this.'alert($(“#grid”))。jqGrid('getGridParam','postData')。filters)'返回 '{“groupOp”:“AND”,“rules”:[{“field”:“Klient_nimi”,“op”:“cn”,“data “:”emil“}]} ' – Andrus

+1

我个人使用的情况下直接设置'window.location'(见[here](http://stackoverflow.com/q/6581791/315935)或[here]( http://stackoverflow.com/q/5759889/315935))。例如'window.location = myServerBaseUrl/Export +'?filters ='+ encodeURIComponent(filters);'onClickButton'内部。 – Oleg