0

One condition its I cant use File.Open or smth like this cause I've already opened Excel file.

So I Trying like this to use AsDataSet() method but throw exception cause (Access denied, even I using FileShare.ReadWrite)

//ExcelDataReader - Config with filter range
 var i = 0;
ExcelDataSetConfiguration excelconfig = new ExcelDataSetConfiguration
{
    ConfigureDataTable = _ => new ExcelDataTableConfiguration
    {
        UseHeaderRow = addHeaders,
        FilterRow = rowreader => rangeExcel.Row <= ++i - 1,
        FilterColumn = (rowreader, colindex) => rangeExcel.Column <= colindex,
     },
     UseColumnDataType = true,
};
//ExcelDataReader using AsDataSet() below
private static DataTable CreateDataReader(Excel.Workbook book, Excel.Range range, ExcelDataSetConfiguration configuration, string sheetName)
{

   var dataSet = new DataSet(sheetName);

   using (var stream = File.Open(book.Path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite))
   {
       using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
       {
          return reader.AsDataSet(configuration).Tables[sheetName];
       }
   }
}

so second variant its =>

private static DataTable CreateDT(Excel.Range range, bool addHeaders)
{
   var dt = new DataTable();
   int i = 1;
   int row = range.Rows.Count;
   int col = range.Columns.Count;

   if (addHeaders)
   {
       //Add headers to dt
       i++;
   }
   else
   {
        //just add columns to dt
   }

 // So here below Two variants =>
 // 1st Working variant on prod

//here throw excetion "Out or Range" while Excel File is Large 40MB
var arrayRowValue = (object[,])range.Cells.Value;

for (; i < range.Rows.Count + 1; i++)
    {
        var dataRow = dt.NewRow();

        object[] arrayToValue = new object[dt.Columns.Count];

        for (int iterator = 0; iterator < arrayToValue.Length; iterator++)
        {
           arrayToValue[iterator] = arrayRowValue[i, iterator + 1];
        }

        dataRow.ItemArray = arrayToValue;

        dt.Rows.Add(dataRow);
    }
}
//2nd variant I want smth like this
DataRow dataRow;
for (; i < row + 1; i++)
{
   dataRow = dt.NewRow();

   for (int iterator = 0; iterator < col; iterator++)
   {
       dataRow.ItemArray = range.Rows[i, iterator + 1].Value;// Not contain Value
   }

   dt.Rows.Add(dataRow);
}

What can help me to better import large excel range into DataTable and most important, faster.

I already read this thread Using ExcelDataReader to read Excel data starting from a particular cell Not helping because every example using File.Open, in my case i cant :) I already have Excel Application but its usless property for me :(

Kirill
  • 51
  • 5

0 Answers0