jqgrid, экспортировать в Excel (с текущими данными post фильтра) на сайте asp.net-mvc

#jquery #asp.net-mvc #jqgrid

#jquery #asp.net-mvc #jqgrid

Вопрос:

у меня есть веб-страница asp.net-mvc, и я использую jqgrid во внешнем интерфейсе. я хочу иметь кнопку экспорта в Excel, которая будет экспортировать текущий набор данных (на основе текущего фильтра).

я уже использую фильтр панели инструментов, поэтому я вижу, что настройки фильтра хранятся в post data, но я не могу понять, как создать метод, который будет передавать все настройки фильтра / правила на сервер из jqgrid.

я вижу кучу примеров jqgrid «экспорт в Excel» после поиска в Google, но похоже на этот пример, ни один из них, похоже, не передает информацию о фильтре на сервер.

Комментарии:

1. Использование HtmlTextWriter для экспорта данных в HTML является быстрым и грязным решением. Если вы используете в выходных данных числа, а не только строки, если вы используете валюту, даты или пользовательские форматы, HTML, который вы будете использовать в Excel, будет очень грубым. Пользователю придется выполнить множество преобразований типов, чтобы иметь возможность сортировать данные, например. Список недостатков очень длинный. Действительно хороший экспорт данных в Excel можно выполнить с помощью Open XML SDK 2.0 для Microsoft Office. Программа будет длиннее, но пользователь получит реальный файл XLSX с правильными типами данных.

Ответ №1:

Вы могли бы поместить скрытые поля внутри формы экспорта в Excel:

 @using (Html.BeginForm(new { action = "ExportToExcel" }))
{
    @Html.Hidden("sidx")
    @Html.Hidden("sord")
    @Html.Hidden("page")
    @Html.Hidden("rows")
    <table id="list"></table>
    <input type="submit" value="Export to Excel" />
}
  

и заполнить их при отправке формы на основе текущих значений:

 $('form').submit(function () {
    var grid = $('#list');
    var sortname = grid.getGridParam('sortname');
    var sortorder = grid.getGridParam('sortorder');
    var page = grid.getGridParam('page');
    var rows = grid.getGridParam('rowNum');
    $('#sidx').val(sortname);
    $('#sord').val(sortorder);
    $('#page').val(page);
    $('#rows').val(rows);
});
  

Таким образом, ExportToExcel действие контроллера примет эти параметры и сможет отфильтровать список.

Комментарии:

1. Я получаю пустое значение Sidx, пожалуйста, помогите мне

Ответ №2:

Что я сделал, так это помещал gridstate в кэш каждый раз, когда запрашиваются данные, затем я выполняю экспорт в Excel, используя gridState. Где-то на сайте jqGrid есть примеры этого:

 //this fragment in GetData method
Session["ExceptionGridState"] = gridModel.ExceptionGrid.GetState(true);
  

Затем, когда вызывается экспорт:

 public ActionResult ExportToExcel_CurrentData()
{
  var gridModel = new ExceptionJqGridModel();
  var grid = gridModel.ExceptionGrid;

  // call the ExportToExcel built-in method
  JQGridState gridState = Session["ExceptionGridState"] as JQGridState;
  gridState.CurrentPageOnly = false;
  grid.ExportToExcel(SourceQuery(),
        String.Format("SomeDatasetName_Filtered_{0:yyyymmddhhmm}.xls", 
            DateTime.Now), 
        gridState);

return View();
  

}

У меня это работает.

Комментарии:

1. Большое вам спасибо! Я черпаю вдохновение в вашем решении, использующем переменную сеанса для каждого параметра сетки!

Ответ №3:

Мне удалось выполнить экспорт с фильтром, вдохновившись вышеупомянутым решением @simpatric greg.

Я устанавливаю одну переменную сеанса для каждого параметра сетки, когда запрашиваются данные, а затем снова передаю их в службу экспорта excel. Решение Грега может работать с asp.net MVC, который подходит для основного вопроса. Следующее решение также может быть использовано со стандартным jqgrid на чистом js:

ДЕЙСТВИЕ СЕТКИ КОНТРОЛЛЕРА

         ...
      Session["jqsidx"] = sidx; 
      Session["jqsord"] = sord; 
      Session["jqpage"] = page; 
      Session["jqrows"] = rows; 
      Session["jq_search"] = _search; 
      Session["jqfilters"] = filters; 
      ....
  

ВЫЗЫВАЕТСЯ ВНУТРИ ДЕЙСТВИЯ ЭКСПОРТА EXCEL ^^

  string sidx = Session["jqsidx"] as String;
 string sord = Session["jqsord"] as String;
 int? page = Session["jqpage"] as Nullable<Int32>;
 int? rows = Session["jqrows"] as Nullable<Int32>;
 bool? _search = Session["jq_search"] as Nullable<bool>;
 string filters = Session["jqfilters"] as String;

var query = myqueryservice.getGridData(sidx, sord, (int)page, (int)rows, (bool)_search, filters, urlparams).ToList();
...
  

Я надеюсь, что это может помочь другим людям, имеющим ту же проблему со стандартным jqgrid.