I'm attempting to export multiple grids to an Excel workbook, with each grid on a different tab. I went through the posting 4 years ago with a similar title and implemented (with some modifications) the code. It worked for the first two grids, but it did not hit the exportEnding callback on the 2nd grid, so it could not recurse into the other grids on the page. I'll paste the two functions in question here so you'll have a better idea.
function ExportGridsToExcel() { var columnsToSkip = ["RowType", "RowFormat", "RowDateFormat"]; var gridIndex = 0; var lengthColumns = gridColumnsArray[gridIndex]; // This will get us to the array of columns for this grid // Loop through each of the column names and skip any columns that start with the name Oversold $.each(lengthColumns, function(index, item) { if (item.key.startsWith("Oversold") && item.key !== "Oversold") { columnsToSkip.push(item.key); } }); var nameToUse = descriptionArray[gridIndex].replace(/ +/g, ' '); // Get the description for this grid and remove extra spaces var workSheetName = nameToUse.substring(0, 31); $.ig.GridExcelExporter.exportGrid($("#mainGrid_" + gridIndex), { fileName: "ForecastExport", worksheetName: workSheetName, columnsToSkip: columnsToSkip }, { exportEnding: function (sender, args) { if (numberOfLayouts > 1) { ExportNextGrid(gridIndex, args.workbook); return false; } else { return true; } } }, { error: function (error) { console.log("Error on export of worksheet " + workSheetName + "Error: " + error); } }); } function ExportNextGrid(gridIndex, workbook) { gridIndex++; // Get to the next grid var columnsToSkip = ["RowType", "RowFormat", "RowDateFormat"]; var lengthColumns = gridColumnsArray[gridIndex]; // This will get us to the array of columns for this grid // Loop through each of the column names and skip any columns that start with the name Oversold $.each(lengthColumns, function(index, item) { if (item.key.startsWith("Oversold") && item.key !== "Oversold") { columnsToSkip.push(item.key); } }); var nameToUse = descriptionArray[gridIndex].replace(/ +/g, ' '); // Get the description for this grid and remove extra spaces var workSheetName = nameToUse.substring(0, 31); var headerArr = []; $.ig.GridExcelExporter.exportGrid($("#mainGrid_" + gridIndex), { fileName: "ForecastExport", worksheetName: workSheetName, columnsToSkip: columnsToSkip }, { headerCellExporting: function (sender, args) { headerArr.push(args.headerText); // Save the names of the headers to assign to the Excel header row if (args.columnIndex === 0) { sender._workbook = workbook; sender._workbook.worksheets().add(sender._worksheet.name()); sender._worksheet = sender._workbook.worksheets(gridIndex); } } }, { exportEnding: function (sender, args) { var row = sender._worksheet.rows(0); // this is the header row // Set the column names for the header row we saved earlier for (var ind = 0; ind < headerArr.length; ind++) { row.setCellValue(ind, headerArr[ind]); } if (gridIndex < numberOfLayouts - 1) { ExportNextGrid(gridIndex, args.workbook); return false; } else { return true; } } }, { error: function (error) { console.log("Error on export of worksheet " + workSheetName + "Error: " + error); } }); }
As you can see I've set it up to recurse into ExportNextGrid, but I've set a breakpoint in the callback for exportEnding and it never gets hit. I can save the spreadsheet and it contains the two grids in different worksheets, but the header row for the 2nd worksheet doesn't have the correct names and it will not recurse to get the other grids.
What am I doing wrong?
Hi Kenneth,
I've put a sample to use the function you have provided. I have only cut some irrelevant stuff like worksheet names, etc. It follows the same exact logic and the exportEnding is fired, and both grids are exported.
Please see the attached sample and let me know if this helps you resolve the issue on your end.GridsToExcel Example.zip
Thank you for your quick response. Yes, it will go to two levels, but it won't go any further than that. The exportEnding callback inside of ExportNextGrid never gets called.
The exportEnding callback was declared outside of the callbacks object, thats why it wasnt called. All callbacks go together:
{ headerCellExporting: function (sender, args) { ... }, exportEnding: function (sender, args) { var row = sender._worksheet.rows(0); // this is the header row ... } }
Please let me know if you have further questions, I will be glad to help.
That was it! Thank you very much!
Hello Kenneth,
I am glad that you managed to achieve your requirement!
Thank you for using Infragistics components.