خرید بک لینک

Vote count: 0

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;
        }
    }

asked 21 secs ago

برچسب: نویسنده: استخدام کار تاريخ: جمعه 18 تير 1395 ساعت: 20:04

صفحه بندی