Home » excel » c# – Kendo Grid print all data to excel, not just visible data

c# – Kendo Grid print all data to excel, not just visible data

Posted by: admin May 14, 2020 Leave a comment

Questions:

Let´s say I have grid with 80 items and pagesize is 10, when printing from the controller I want to print all the data, not just the visible data on the first page.

I have good “Export Grid to Excel” test project from Telerik, and I´ve got the export feature all covered and working like a charm. Basically just including the NPOI file and start using it.

Is there a way for me to iterate all the product-data from the DataSourceRequest?

My code sample:

public FileResult Export([DataSourceRequest]DataSourceRequest request)
{
//Get the data representing the current grid state - page, sort and filter
IEnumerable products = db.Products.ToDataSourceResult(request).Data;


//TODO: Get all data but not just the data from the visible page as above!!!


//Create new Excel workbook
var workbook = new HSSFWorkbook();

//Create new Excel sheet
var sheet = workbook.CreateSheet();

//(Optional) set the width of the columns
sheet.SetColumnWidth(0, 10 * 256);
sheet.SetColumnWidth(1, 50 * 256);
sheet.SetColumnWidth(2, 50 * 256);
sheet.SetColumnWidth(3, 50 * 256);

//Create a header row
var headerRow = sheet.CreateRow(0);

//Set the column names in the header row
headerRow.CreateCell(0).SetCellValue("Product ID");
headerRow.CreateCell(1).SetCellValue("Product Name");
headerRow.CreateCell(2).SetCellValue("Unit Price");
headerRow.CreateCell(3).SetCellValue("Quantity Per Unit");

//(Optional) freeze the header row so it is not scrolled
sheet.CreateFreezePane(0, 1, 0, 1);

int rowNumber = 1;

//Populate the sheet with values from the grid data
foreach (Product product in products)
{
    //Create a new row
    var row = sheet.CreateRow(rowNumber++);

    //Set values for the cells
    row.CreateCell(0).SetCellValue(product.ProductID);
    row.CreateCell(1).SetCellValue(product.ProductName);
    row.CreateCell(2).SetCellValue(product.UnitPrice.ToString());
    row.CreateCell(3).SetCellValue(product.QuantityPerUnit.ToString());
}

//Write the workbook to a memory stream
MemoryStream output = new MemoryStream();
workbook.Write(output);

//Return the result to the end user

return File(output.ToArray(),   //The binary data of the XLS file
    "application/vnd.ms-excel", //MIME type of Excel files
    "GridExcelExport.xls");     //Suggested file name in the "Save as" dialog which will be displayed to the end user

}
How to&Answers:

The source from the DataSourceRequest class can be found here.

Probably if you disable the paging properties, you’ll get all filtered + sorted data:

public FileResult Export([DataSourceRequest]DataSourceRequest request)
{
  request.Take = 9999999;
  request.Skip = 0;

  // Get the data representing the current grid state : sort and filter
  IEnumerable products = db.Products.ToDataSourceResult(request).Data;

Answer:

After some time I stumbled upon an answer that works. @Stef answer got me on the right track although I didn´t actually use his answer, I will therefore up his answer for the help. I found a way to count the number of pages, and then simply edited the DataSourceRequest for each page. This way ensures me all the pages from the database. I hope this helps others in the future 🙂

public FileResult Export([DataSourceRequest]DataSourceRequest request)
{
//Count pages to use as iterator when adding to list
var pages = db.Products.ToDataSourceResult(request).Total/request.PageSize;

//Get the data representing the current grid state - page, sort and filter
//IEnumerable products = db.Products.ToDataSourceResult(request).Data;

//Get the data representing the current grid state - page, sort and filter
var products = new List<Product>();

//To ensure all pages get fetched from db
for (int i = 1; i < pages + 1; i++)
{
    request.Page = i;
    IEnumerable prod = db.Products.ToDataSourceResult(request).Data;
    products.AddRange(prod.Cast<Product>().ToList());
}

//Create new Excel workbook
var workbook = new HSSFWorkbook();

//Create new Excel sheet
var sheet = workbook.CreateSheet();

//(Optional) set the width of the columns
sheet.SetColumnWidth(0, 10 * 256);
sheet.SetColumnWidth(1, 50 * 256);
sheet.SetColumnWidth(2, 50 * 256);
sheet.SetColumnWidth(3, 50 * 256);

//Create a header row
var headerRow = sheet.CreateRow(0);

//Set the column names in the header row
headerRow.CreateCell(0).SetCellValue("Product ID");
headerRow.CreateCell(1).SetCellValue("Product Name");
headerRow.CreateCell(2).SetCellValue("Unit Price");
headerRow.CreateCell(3).SetCellValue("Quantity Per Unit");

//(Optional) freeze the header row so it is not scrolled
sheet.CreateFreezePane(0, 1, 0, 1);

int rowNumber = 1;

//Populate the sheet with values from the grid data
foreach (Product product in products)
{
    //Create a new row
    var row = sheet.CreateRow(rowNumber++);

    //Set values for the cells
    row.CreateCell(0).SetCellValue(product.ProductID);
    row.CreateCell(1).SetCellValue(product.ProductName);
    row.CreateCell(2).SetCellValue(product.UnitPrice.ToString());
    row.CreateCell(3).SetCellValue(product.QuantityPerUnit.ToString());
}

//Write the workbook to a memory stream
MemoryStream output = new MemoryStream();
workbook.Write(output);

//Return the result to the end user

return File(output.ToArray(),   //The binary data of the XLS file
    "application/vnd.ms-excel", //MIME type of Excel files
    "GridExcelExport.xls");     //Suggested file name in the "Save as" dialog which will be displayed to the end user
}

Answer:

you may use javascript to print all data to excel, like below

function ExportToCSV() {

         var dataSource = $("#grid").data("kendoGrid").dataSource;
         var filteredDataSource = new kendo.data.DataSource({
             data: dataSource.data(),
             filter: dataSource.filter()
         });

         filteredDataSource.read();
         var data = filteredDataSource.view();

         var result = "data:application/vnd.ms-excel,";

         result += "<table><tr><th>ProductID</th><th>ProductName</th><th>UnitPrice</th><th>Discontinued</th><th>UnitsInStock</th><th>Category</th></tr>";

         for (var i = 0; i < data.length; i++) {
             result += "<tr>";

             result += "<td>";
             result += data[i].ProductID;
             result += "</td>";

             result += "<td>";
             result += data[i].ProductName;
             result += "</td>";

             ..

             result += "</tr>";
         }

             result += "</table>";
             if (window.navigator.msSaveBlob) {
                 window.navigator.msSaveBlob(new Blob([result]), 'export.xls');
             } else {
                 window.open(result);
             }


             e.preventDefault();
         }

hope this may help