2014-01-14 2 views
5

Я следует, что учебник об экспорте Кендо сетки данных: http://www.kendoui.com/blogs/teamblog/posts/13-03-12/exporting_the_kendo_ui_grid_data_to_excel.aspxЭкспорт всех данных из Кендо Сетка источника данных

Теперь я пытаюсь экспортировать все данные (не только показал страницу) ... Как я могу это сделать?

Я попытался изменить pagezise, ​​прежде чем получить данные:

grid.dataSource.pageSize(grid.dataSource.total()); 

Но что моя фактическая сетка обновления с новой PAGESIZE. Это способ запросить источник данных kendo без обновления сетки?

Благодаря

ответ

5

Лучшее решение для генерации файла Excel из реальных данных, а не из DataSource.

1] На странице HTML, добавьте

$('#export').click(function() { 
    var title = "EmployeeData"; 
    var id = guid(); 
    var filter = $("#grid").data("kendoGrid").dataSource._filter; 

    var data = { 
     filter: filter, 
     title: title, 
     guid: id 
    }; 

    $.ajax({ 
     url: '/Employee/Export', 
     type: "POST", 
     dataType: 'json', 
     data: JSON.stringify(data), 
     contentType: "application/json; charset=utf-8", 
     success: function (result) { 
      window.location = kendo.format("{0}?title={1}&guid={2}", '/Employee/GetGeneratedExcel', title, id); 
     } 
    }); 
}); 


2] Добавить метод "Экспорт" к контроллеру:

[HttpPost] 
public JsonResult Export(KendoGridFilter filter, string guid) 
{ 
    var gridRequest = new KendoGridRequest(); 
    if (filter != null) 
    { 
     gridRequest.FilterObjectWrapper = filter.Filters != null ? filter.ToFilterObjectWrapper() : null; 
     gridRequest.Logic = filter.Logic; 
    } 

    var query = GetQueryable().AsNoTracking(); 
    var results = query.FilterBy<Employee, EmployeeVM>(gridRequest); 

    using (var stream = new MemoryStream()) 
    { 
     using (var excel = new ExcelPackage(stream)) 
     { 
      excel.Workbook.Worksheets.Add("Employees"); 
      var ws = excel.Workbook.Worksheets[1]; 
      ws.Cells.LoadFromCollection(results); 
      ws.Cells.AutoFitColumns(); 

      excel.Save(); 
      Session[guid] = stream.ToArray(); 
      return Json(new { success = true }); 
     } 
    } 
} 


3] добавить также метод " GetGeneratedExcel "к контроллеру:

[HttpGet] 
public FileResult GetGeneratedExcel(string title, string guid) 
{ 
    // Is there a spreadsheet stored in session? 
    if (Session[guid] == null) 
    { 
     throw new Exception(string.Format("{0} not found", title)); 
    } 

    // Get the spreadsheet from session. 
    var file = Session[guid] as byte[]; 
    string filename = string.Format("{0}.xlsx", title); 

    // Remove the spreadsheet from session. 
    Session.Remove(title); 

    // Return the spreadsheet. 
    Response.Buffer = true; 
    Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", filename)); 
    return File(file, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", filename); 
} 

Также смотрите этот проект на github.

См. this проект живого примера, в котором вы можете экспортировать сотрудников в Excel. (Хотя это возвращает фильтруются данные, но вы можете изменить код, чтобы игнорировать фильтр кендо сетки и всегда возвращать все данные. Панель

+0

Спасибо за помощь ... Сделав это, мне нужно создать метод экспорта во всех моих контроллерах (100+). Сегодня у меня есть один Controller Export и частичный просмотр для экспорта кнопки, где мне нужно. – Paul

+0

hi @Stef, Он отлично работает в IE, но в Chrome он сохраняет файл «title.xlsx, attachache», вы можете его исправить? –

+0

Пожалуйста, создайте проблему в github для этого проекта: https://github.com/StefH/KendoGridBinderEx –

-1

Сетки

.. 
.ToolBar(toolbar => 
    { 
     toolbar.Template(
      @<text> 
       @Html.Kendo().Button().Name("grid-export").HtmlAttributes(new { type = "button", data_url = @Url.Action("Export") }).Content("Export").Events(ev => ev.Click("exportGrid")) 
      </text>); 
    }) 
.. 

функция экспорта конечной точки

public FileResult Export([DataSourceRequest]DataSourceRequest request) 
     { 
      DemoEntities db = new DemoEntities(); 
      byte[] bytes = WriteExcel(db.Table.ToDataSourceResult(request).Data, new string[] { "Id", "Name" }); 

      return File(bytes, 
       "application/vnd.ms-excel", 
       "GridExcelExport.xls"); 
     } 

в JavaScript для генерации сетки удаленного экспортного URL со всеми указанными параметрами

function exportGrid() { 
    var toolbar = $(this.element); 
    var gridSelector = toolbar.closest(".k-grid"); 
    var grid = $(gridSelector).data("kendoGrid"); 
    var url = toolbar.data("url"); 

    var requestObject = (new kendo.data.transports["aspnetmvc-server"]({ prefix: "" })) 
     .options.parameterMap({ 
      page: grid.dataSource.page(), 
      sort: grid.dataSource.sort(), 
      filter: grid.dataSource.filter() 
     }); 

    url = url + "?" + $.param({ 
     "page": requestObject.page || '~', 
     "sort": requestObject.sort || '~', 
     "pageSize": grid.dataSource.pageSize(), 
     "filter": requestObject.filter || '~', 
    }); 
    window.open(url, '_blank'); 
} 

Для детального решения см мой пример проекта на Github

, где и можно экспортировать сторону сетки сервера с текущей конфигурации (сортировка, фильтрация, пейджинг) с помощью вспомогательной функции

+0

@AlvaroAV сделана с включением существенных частей здесь –

2

Действительно старый вопрос но:

К экспорт все страницы используют excel.allPages:

$("#grid").kendoGrid({ 
    toolbar: ["excel"], 
    excel: { 
     allPages: true 
    }, 
    // .... 
}); 

See Example

Смежные вопросы