将大块数据导出到Excel

我想导出一个2-D数组,以便在List<DataSet>包含大量的数据。

如果我将DataSet分成每个DataSet有5000行的块,每个DataSet包含66个字段, WorkSheets在单个WorkBook有60多个WorkBook

我理想的是能够将我的List<DataSet>对象中的每个Table中的数据追加到单个WorkSheet

如果这是可能的话,我需要一些帮助来获得解决scheme。 使用包含该大小matrix的单个DataSet分配Excel.Range会导致System.OutOfMemoryException

以下是我目前如何将我的DataTable分成块:

 internal static class ExtensionMethods { internal static List<DataTable> SplitDataSetIntoMultipleTables(this DataTable tableToClone, int countLimit) { List<DataTable> tables = new List<DataTable>(); int sheetNumber = 0; DataTable copyTable = null; foreach (DataRow dr in tableToClone.Rows) { if ((count++ % countLimit) == 0) { sheetNumber++; copyTable = new DataTable(); copyTable = tableToClone.Clone(); copyTable.TableName = "Table " + sheetNumber; tables.Add(copyTable); } copyTable.ImportRow(dr); } return tables; } } 

我这样调用这个方法:

 dt = new DataTable(); dt = await Task.Run(() => logic.PopulateDataTable()); DataSet ds = new DataSet(); var lstTables = await Task.Run(() => ExtensionMethods.SplitDataSetIntoMultipleTables(dt, 5000)); List<DataSet> dsList = new List<DataSet>(); for (int i = 0; i < ds.Tables.Count; i++) { dsList.Add(ds); } await Task.Run(() => DataSetsToExcel(dsList, @"C:\Users\me\Desktop\OutputSpreadsheet_" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx")); 

DataSetsToExcel方法…注意,这只是我在网上find的许多方法之一…我稍微调整了一下:

 void DataSetsToExcel(List<DataSet> dataSets, string fileName) { try { Excel.Application xlApp = new Excel.Application(); Excel.Workbook xlWorkbook = xlApp.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); Excel.Sheets xlSheets = null; Excel.Worksheet xlWorksheet = null; int i = 0; foreach (DataSet dataSet in dataSets) { System.Data.DataTable dataTable = dataSet.Tables[0]; int rowNo = dataTable.Rows.Count; int columnNo = dataTable.Columns.Count; int colIndex = 0; //Create Excel Sheets xlSheets = xlWorkbook.Sheets; xlWorksheet = (Excel.Worksheet)xlSheets.Add(xlSheets[1], Type.Missing, Type.Missing, Type.Missing); xlWorksheet.Name = dataSet.Tables[i].ToString(); //Generate Field Names foreach (DataColumn dataColumn in dataTable.Columns) { colIndex++; xlApp.Cells[1, colIndex] = dataColumn.ColumnName; } object[,] objData = new object[rowNo, columnNo]; //Convert DataSet to Cell Data for (int row = 0; row < rowNo; row++) { for (int col = 0; col < columnNo; col++) { objData[row, col] = dataTable.Rows[row][col]; } } //Add the Data Excel.Range range = xlWorksheet.Range[xlApp.Cells[2, 1], xlApp.Cells[rowNo + 1, columnNo]]; range.Value2 = objData; //Format Data Type of Columns colIndex = 0; foreach (DataColumn dataColumn in dataTable.Columns) { colIndex++; string format = "@"; switch (dataColumn.DataType.Name) { case "Boolean": break; case "Byte": break; case "Char": break; case "DateTime": format = "dd/mm/yyyy"; break; case "Decimal": format = "$* #,##0.00;[Red]-$* #,##0.00"; break; case "Double": break; case "Int16": format = "0"; break; case "Int32": format = "0"; break; case "Int64": format = "0"; break; case "SByte": break; case "Single": break; case "TimeSpan": break; case "UInt16": break; case "UInt32": break; case "UInt64": break; default: //String break; } //Format the Column accodring to Data Type xlWorksheet.Range[xlApp.Cells[2, colIndex], xlApp.Cells[rowNo + 1, colIndex]].NumberFormat = format; } i++; } //Remove the Default Worksheet ((Excel.Worksheet)xlApp.ActiveWorkbook.Sheets[xlApp.ActiveWorkbook.Sheets.Count]).Delete(); //Save xlWorkbook.SaveAs(fileName, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, Excel.XlSaveAsAccessMode.xlNoChange, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value, System.Reflection.Missing.Value); xlWorkbook.Close(); xlApp.Quit(); GC.Collect(); } catch (Exception ex) { throw; } }