XtraGrid - Export To Excel

二次信任 提交于 2019-12-08 07:26:55

问题


I'am using Developer Express XtraGrid Component to show some data. I have 2 XtraGrid on my Windows Application Form. Both grids have more than 200k+ lines, and 8 columns of data, and I have export to excel button. There are two ways (as I know) for exporting grid data to excel.

1- grid.ExportToXls(); or grid.ExportToXlsx();

2- Using Office Interop, and OpenXML Utilities

If I use grid.ExportToXls(); or grid.ExportToXlsx();, the process time is faster than Office Interop Codes (for arround 2k lines of data). But, this method can be used for just 1 grid. So result appears on 2 different Excel files. So, I'am using Office Interop to merge workbooks after process completed. Here is the problem occurs. With both these ways, I am always getting System.OutOfMemory Exception. (See the memory graph below)

I'am stuck here, because the ways I know to export excel are throwing System.OutOfMemory Exception. Do you have any suggestion, how can I export more than 200k - 300k+ lines of data to Excel? I'am using .Net Framework 3.5 on Visual Studio 2010. And you can find my Interop, and Document.Format OpenXML Utility codes below.

try
{
   SaveFileDialog saveDialog = new SaveFileDialog();
   saveDialog.Title = SaveAsTitle;
   saveDialog.Filter = G.Instance.MessageManager.GetResourceMessage("EXCEL_FILES_FILTER");
                saveDialog.ShowDialog();

   if (string.IsNullOrEmpty(saveDialog.FileName))
   {
   // Showing Warning
   return;
   }

   List<GridControl> exportToExcel = new List<GridControl>();
   exportToExcel.Add(dataGrid);
   exportToExcel.Add(summaryGrid);

   ExportXtraGridToExcel2007(saveDialog.FileName, exportToExcel);
}
catch (Exception ex)
{
  // Showing Error
}

And this is my ExportXtraGridToExcel2007(); function codes

public void ExportXtraGridToExcel2007(string path, List<GridControl> grids)
        {
            try
            {
                DisableMdiParent();
                string tmpPath = Path.GetTempPath();
                List<string> exportedFiles = new List<string>();

                for (int i = 0; i < grids.Count; i++)
                {
                    string currentPath = string.Format(@"{0}\document{1}.xlsx", tmpPath, i);
                    GridControl grid = grids[i];
                    grid.MainView.ExportToXlsx(currentPath);
                    exportedFiles.Add(currentPath);
                }

                if (exportedFiles.Count > 0)
                {
                    OpenXmlUtilities.MergeWorkbooks(path, exportedFiles.ToArray());
                    foreach (string excel in exportedFiles)
                    {
                        if (File.Exists(excel))
                        {
                            try
                            {
                                File.Delete(excel);
                            }
                            catch (Exception ex)
                            {
                                EventLog.WriteEntry("Application", ex.Message);
                            }
                        }
                    }

                }                
            }
            catch (Exception ex)
            {
            // showing error
        }
            finally
            {
                EnableMdiParent();
            }
        }

and this is the OpenXML Merge Work Books Codes

public static void MergeWorkbooks(string path, string[] sourceWorkbookNames)
        {
            WorkbookPart mergedWorkbookPart = null;

            WorksheetPart mergedWorksheetPart = null;
            WorksheetPart childWorksheetPart = null;

            Sheets mergedWorkbookSheets = null;
            Sheets childWorkbookSheets = null;

            Sheet newMergedSheet = null;
            SheetData mergedSheetData = null;

            SharedStringTablePart mergedSharedStringTablePart = null;
            SharedStringTablePart childSharedStringTablePart = null;

            // Create the merged workbook package.
            using (SpreadsheetDocument mergedWorkbook =
                SpreadsheetDocument.Create(path,
                SpreadsheetDocumentType.Workbook))
            {
                // Add the merged workbook part to the new package.
                mergedWorkbookPart = mergedWorkbook.AddWorkbookPart();
                GenerateMergedWorkbook().Save(mergedWorkbookPart);

                // Get the Sheets element in the merged workbook for use later. 
                mergedWorkbookSheets = mergedWorkbookPart.Workbook.GetFirstChild<Sheets>();

                // Create the Shared String Table part in the merged workbook.
                mergedSharedStringTablePart = mergedWorkbookPart.AddNewPart<SharedStringTablePart>();
                GenerateSharedStringTablePart().Save(mergedSharedStringTablePart);

                // For each source workbook to merge...
                foreach (string workbookName in sourceWorkbookNames)
                {
                    // Open the source workbook. The following will throw an exception if
                    // the source workbook does not exist.
                    using (SpreadsheetDocument childWorkbook =
                        SpreadsheetDocument.Open(workbookName, false))
                    {
                        // Get the Sheets element in the source workbook.
                        childWorkbookSheets = childWorkbook.WorkbookPart.Workbook.GetFirstChild<Sheets>();

                        // Get the Shared String Table part of the source workbook.
                        childSharedStringTablePart = childWorkbook.WorkbookPart.SharedStringTablePart;

                        // For each worksheet in the source workbook...
                        foreach (Sheet childSheet in childWorkbookSheets)
                        {
                            // Get a worksheet part for the source worksheet using it's relationship Id. 
                            childWorksheetPart = (WorksheetPart)childWorkbook.WorkbookPart.GetPartById(childSheet.Id);

                            // Add a worksheet part to the merged workbook based on the source worksheet.
                            mergedWorksheetPart = mergedWorkbookPart.AddPart<WorksheetPart>(childWorksheetPart);

                            // There should be only one worksheet that is set as the main view.
                            CleanView(mergedWorksheetPart);

                            // Create a Sheet element for the new sheet in the merged workbook.
                            newMergedSheet = new Sheet();

                            // Set the Name, Id, and SheetId attributes of the new Sheet element.
                            newMergedSheet.Name = GenerateWorksheetName(mergedWorkbookSheets, childSheet.Name.Value);
                            newMergedSheet.Id = mergedWorkbookPart.GetIdOfPart(mergedWorksheetPart);
                            newMergedSheet.SheetId = (uint)mergedWorkbookSheets.ChildElements.Count + 1;

                            // Add the new Sheet element to the Sheets element in the merged workbook.
                            mergedWorkbookSheets.Append(newMergedSheet);

                            // Get the SheetData element of the new worksheet part in the merged workbook.
                            mergedSheetData = mergedWorksheetPart.Worksheet.GetFirstChild<SheetData>();

                            // For each row of data...
                            foreach (Row row in mergedSheetData.Elements<Row>())
                            {
                                // For each cell in the row...
                                foreach (Cell cell in row.Elements<Cell>())
                                {
                                    // If the cell is using a shared string then merge the string
                                    // from the source workbook into the merged workbook. 
                                    if (cell.DataType != null &&
                                        cell.DataType.Value == CellValues.SharedString)
                                    {
                                        ProcessCellSharedString(mergedWorksheetPart, cell,
                                            mergedSharedStringTablePart, childSharedStringTablePart);
                                    }
                                }
                            }
                        }
                    }
                }

                //Save the changes to the merged workbook.
                mergedWorkbookPart.Workbook.Save();
            }
        }

回答1:


I would use the built-in method from XtraGrid to export to excel as you say it's even faster.

After having generated the two excel files I would use Excel Interop assemblies only to merge the two resulting files in the same file on two separated Excel Sheets in same workbook.

so your problem would not be with XtraGrid anymore but simply with how to merge two files into one in separated worksheets, discussed many times already and you will find solutions online, for example here: How do I merge 2 Excel files into one excel file with separated sheets?




回答2:


I know this is a late answer but, you can use devExpress methods and components to export multiple grids to the same excel file. (Perhaps this was not the case in older versions, I am not sure when it became available)

Add a printableComponentLink to each gridControl, and then Create a compositeLink that you can add each of the printableComponent links to.

Then you will use the compositeLink.ExportToXlsx method. If you create XlsxExportOptions with the XlsxExportOptions.ExportMode property equal to SingleFilePageByPage and pass it to the CompositeLink.ExportToXlsx method, every page will be exported to a separate sheet.

This post brought this question to my attention.



来源:https://stackoverflow.com/questions/5075563/xtragrid-export-to-excel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!