6
votes

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.

3
Not sure if it matters, but the action you're referring to in the .Excel() line is not the same name as your listed controller method.Matt Millican
I also noticed this. But once I fixed it nothing changed. I also set a breakpoint in the method and it didn't break even after I changed the name.Matt Kagan
I've not used the Excel export yet. I will try it tonight.Matt Millican

3 Answers

9
votes

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())
     )
)
7
votes

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>
1
votes

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.