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 :(