#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.