Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kendo Grid Export to Excel -All Pages not working

I have a pageable and filterable grid which I set up to export to excel using the new Kendo Grid Excel feature. However, even when I set AllPages to be true I only get the first 10 results, no matter what I set the pagesize to. Removing the Pageable attribute gives me the full reults. Anyone else have problems with this?

Here's the setup for my grid.

@(Html.Kendo().Grid(Model.CloudUsage)
.Name("PCloudUsages")
.ToolBar(toolbar =>
{
    toolbar.Excel().HtmlAttributes(new { @class = "toolbar-field" });
})
.Columns(columns =>
{
    columns.Bound(c => c.ProjectCode).Filterable(ftb => ftb.Cell(cell => cell.Operator("contains").ShowOperators(false)));
    columns.Bound(c => c.ProjectName).Title("ProjectName").Filterable(ftb => ftb.Cell(cell => cell.Operator("contains").ShowOperators(false)));
})
.Pageable(p => p.ButtonCount(5).PageSizes(new int[] { 10, 20, 50, 100 }))
.Filterable(ftb => ftb.Mode(GridFilterMode.Row))
.Sortable()
.Excel(excel => excel.FileName("CloudUsages.xlsx").Filterable(true).ProxyURL(Url.Action("ExportExcel", "Admin")).AllPages(true))
.DataSource(source => source
    .Ajax()
     .Model(m => m.Id(itm => itm.ProjectName))
     .Read(read => read.Action("PCloudUsages_Read", "Admin").Data("GetDates"))
     .Sort(sort => sort.Add(itm => itm.ProjectName).Descending())
     )
)

And the controller method

public ActionResult ExportExcel(string contentType, string base64, string fileName)
{
    var fileContents = Convert.FromBase64String(base64);

    return File(fileContents, contentType, fileName);
}

Edit: I have noticed that changing the "pageSize" attribute of the datasource changes the number of rows in the excel file. So it seems that it always produces the excel file the size of the Datasource Pagesize, no matter if the AllPages is set to true, or what the pagesize is set to on the grid.

like image 995
Matt Kagan Avatar asked Dec 02 '14 15:12

Matt Kagan


3 Answers

Figured out what it was I was doing wrong. The issue wasn't with the Excel issue, it was with my grid in general. I was tying the grid to a List that was part of my ViewModel, which was being populated on page load. I should have instead left the data blank and only specified the type of the grid. That way the Read Action fetches the data when the grid loads AND when the excel is generated. The new code should look like this:

@(Html.Kendo().Grid<CloudUsages>()
.Name("PCloudUsages")
.ToolBar(toolbar =>
{
    toolbar.Excel().HtmlAttributes(new { @class = "toolbar-field" });
})
.Columns(columns =>
{
    columns.Bound(c => c.ProjectCode).Filterable(ftb => ftb.Cell(cell => cell.Operator("contains").ShowOperators(false)));
    columns.Bound(c => c.ProjectName).Title("ProjectName").Filterable(ftb => ftb.Cell(cell => cell.Operator("contains").ShowOperators(false)));
})
.Pageable(p => p.ButtonCount(5).PageSizes(new int[] { 10, 20, 50, 100 }))
.Filterable(ftb => ftb.Mode(GridFilterMode.Row))
.Sortable()
.Excel(excel => excel.FileName("CloudUsages.xlsx").Filterable(true).ProxyURL(Url.Action("ExportExcel", "Admin")).AllPages(true))
.DataSource(source => source
    .Ajax()
     .Model(m => m.Id(itm => itm.ProjectName))
     .Read(read => read.Action("PCloudUsages_Read", "Admin").Data("GetDates"))
     .Sort(sort => sort.Add(itm => itm.ProjectName).Descending())
     )
)
like image 141
Matt Kagan Avatar answered Oct 17 '22 23:10

Matt Kagan


I landed on this page for the search "Kendo mvc grid export to excel not working" But the scenario here is different. For people like me I am posting the possible solution

You must be missing out the jszip.min.js file reference

<script src="~/Scripts/kendo/jszip.min.js"></script>
like image 29
Rajshekar Reddy Avatar answered Oct 17 '22 21:10

Rajshekar Reddy


Use @(Html.Kendo().Grid<TYPE>() instead of @(Html.Kendo().Grid(Model.CloudUsage). This way you can still define columns based on the properties of the type you used, this is also an advantage over @(Html.Kendo().Grid<dynamic>() if you know what your type will be.

like image 32
James Gilje Avatar answered Oct 17 '22 22:10

James Gilje