首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XtraGrid -导出到XtraGrid

XtraGrid -导出到XtraGrid
EN

Stack Overflow用户
提问于 2011-02-22 16:04:23
回答 2查看 16.4K关注 0票数 1

我正在使用Developer Express XtraGrid组件来显示一些数据。我的视窗申请表上有两个XtraGrid。两个网格都有超过200k+行和8列的数据,我有导出到excel按钮。据我所知,有两种方法可以将网格数据导出到excel中。

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

2-使用Office Interop和OpenXML Utilities

如果我使用grid.ExportToXls();grid.ExportToXlsx();,处理时间比Office Interop代码(大约2k行数据)要快。但是,这种方法只能用于1个网格。所以结果会出现在两个不同的Excel文件中。因此,我正在使用Office Interop在进程完成后合并工作簿。这就是出现的问题。使用这两种方法,我总是得到System.OutOfMemory异常。(参见下面的内存图)

我被困在这里,因为我所知道的导出excel的方法都抛出了System.OutOfMemory异常。您有什么建议,如何将超过200k - 300k+行的数据导出到Excel?我在Visual Studio 2010上使用.Net Framework 3.5。你可以在下面找到我的Interop和Document.Format OpenXML Utility代码。

代码语言:javascript
运行
复制
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
}

这是我的ExportXtraGridToExcel2007();函数代码

代码语言:javascript
运行
复制
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();
            }
        }

这是OpenXML合并工作手册的代码

代码语言:javascript
运行
复制
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();
            }
        }
EN

回答 2

Stack Overflow用户

发布于 2011-10-03 22:42:18

我会使用XtraGrid的内置方法来导出到excel,正如您所说的那样,它甚至更快。

因此,您的问题不再是XtraGrid,而是如何将两个文件合并为一个单独的工作表,这已经讨论了很多次,您将在网上找到解决方案,例如这里:How do I merge 2 Excel files into one excel file with separated sheets?

票数 2
EN

Stack Overflow用户

发布于 2012-04-26 00:18:33

我知道这是一个迟来的答案,但是,您可以使用devExpress方法和组件将多个网格导出到同一个excel文件中。(也许在旧版本中不是这样,我不确定它是什么时候推出的)

将printableComponentLink添加到每个gridControl,然后创建一个compositeLink,您可以将每个printableComponent链接添加到该the。

然后您将使用compositeLink.ExportToXlsx方法。如果使用等于SingleFilePageByPage的XlsxExportOptions.ExportMode属性创建XlsxExportOptions,并将其传递给CompositeLink.ExportToXlsx方法,则每个页面都将导出到单独的工作表。

这个post让我注意到了这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5075563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档