1

Developer Express XtraGridComponent を使用してデータを表示しています。XtraGridWindows アプリケーション フォームに2 つあります。両方のグリッドには 200k 以上の行と 8 列のデータがあり、Excel へのエクスポート ボタンがあります。グリッド データを Excel にエクスポートするには、(私が知っているように) 2 つの方法があります。

1-grid.ExportToXls();またはgrid.ExportToXlsx();

2- Office 相互運用機能の使用、およびOpenXML Utilities

grid.ExportToXls();またはを使用するgrid.ExportToXlsx();と、処理時間は Office Interop Codes よりも速くなります (約 2,000 行のデータの場合)。ただし、この方法は 1 つのグリッドに対してのみ使用できます。したがって、結果は 2 つの異なるExcelファイルに表示されます。そのため、Office Interop を使用して、プロセスの完了後にワークブックをマージしています。ここで問題が発生します。これらの両方の方法で、私は常にSystem.OutOfMemory例外を取得しています。(下のメモリグラフを参照) ここに画像の説明を入力

Excel をエクスポートする方法を知っているとSystem.OutOfMemory例外がスローされるため、ここで立ち往生しています。200k ~ 300k+ 行のデータを にエクスポートするにはどうすればよいExcelですか? を使用.Net Framework 3.5していVisual Studio 2010ます。私の Interop とDocument.Format OpenXML Utilityコードは以下にあります。

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();機能コードです

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 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();
            }
        }
4

2 に答える 2

2

あなたが言うように、XtraGridの組み込みメソッドを使用してExcelにエクスポートします。

2 つの Excel ファイルを生成した後、Excel Interop アセンブリのみを使用して、結果の 2 つのファイルを同じブック内の 2 つの別々の Excel シートの同じファイルにマージします。

したがって、あなたの問題はもう XtraGrid ではなく、2 つのファイルを別々のワークシートで 1 つにマージする方法だけであり、すでに何度も議論されており、オンラインで解決策を見つけることができます。たとえば、次のようになります。セパレートシート?

于 2011-10-03T14:42:18.250 に答える
1

これが遅い答えであることは知っていますが、devExpress メソッドとコンポーネントを使用して、複数のグリッドを同じ Excel ファイルにエクスポートできます。(おそらくこれは古いバージョンには当てはまらなかったため、いつ利用可能になったかはわかりません)

各 gridControl に printableComponentLink を追加してから、各 printableComponent リンクを追加できる compositeLink を作成します。

次に、compositeLink.ExportToXlsx メソッドを使用します。XlsxExportOptions.ExportMode プロパティを SingleFilePageByPage に設定して XlsxExportOptions を作成し、それを CompositeLink.ExportToXlsx メソッドに渡すと、すべてのページが個別のシートにエクスポートされます。

この投稿により、この質問に注意が向けられました。

于 2012-04-25T16:18:33.087 に答える