I want to export a 2-D Array to excel containing chunks of data in a List<DataSet>.
If I split my DataSets into chunks of 5000 rows per DataSet, with each DataSet containing 66 fields, I end up with 60-odd WorkSheets in a single WorkBook.
What I'd ideally like is the ability to append the data from each Table in my List<DataSet> object to a single WorkSheet.
If this is at all possible, I need some assistance getting to a solution. Assigning an Excel.Range with a single DataSet containing a matrix of that size causes a System.OutOfMemoryException.
Here's how I currently split my DataTable into chunks:
inteal static class ExtensionMethods
{
inteal 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);
}
retu tables;
}
}
I call this method like this:
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:UsersmeDesktopOutputSpreadsheet_" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx"));
DataSetsToExcel Method...note that this is just ONE of the MANY methods I've found online:
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;
}
}
