#c# #exceldatareader
#c# #exceldatareader
Вопрос:
Я использую ExcelDataReader и ExcelDataReader.Библиотеки наборов данных для чтения более 1700 строк из xlsx-файла. В конечном итоге, нет прочитанных записей. Однако, если мы ограничим количество строк в dile до 9 — все данные строк будут прочитаны правильно. Вот код:
private IEnumerable<T> ParseImportSourceFile<T>(string fileName, byte[] file) where T : CsvClassMap
{
IEnumerable<T> records = null;
var extensionEnd = Path.GetExtension(fileName).ToLower();
switch (Path.GetExtension(fileName).ToLower())
{
case ".csv":
break;
case ".xls":
case ".xlsx":
case ".ods":
records = new List<T>();
var memoryStream = new MemoryStream(file);
var streamReader = new StreamReader(memoryStream);
var reader = ExcelReaderFactory.CreateReader(streamReader.BaseStream);
if (extensionEnd == ".xlsx")
{
reader = ExcelReaderFactory.CreateOpenXmlReader(streamReader.BaseStream);
//reader.
}
//reader.AsDataSet().
try
{
var result = reader.AsDataSet(new ExcelDataSetConfiguration()
{
UseColumnDataType = true,
ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
{
EmptyColumnNamePrefix = "Column",
UseHeaderRow = true,
}
});
if (result.Tables.Count > 0)
{
var tbl = result.Tables[0];
//grab column names into array
var columns = new DataColumn[tbl.Columns.Count];
tbl.Columns.CopyTo(columns, 0);
//grab properties of T class
var tType = typeof(T);
var properties = tType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
for (int i = 0; i < tbl.Rows.Count; i )
{
//one row one record... create an instance for each row
var row = tbl.Rows[i];
var record = Activator.CreateInstance<T>();
//read all columns and try set valid property
foreach (var col in columns)
{
var prop = properties.FirstOrDefault(x => x.Name == col.ColumnName ||
(x.GetCustomAttribute<DisplayAttribute>() != null amp;amp; x.GetCustomAttribute<DisplayAttribute>().Name == col.ColumnName));
if (prop != null amp;amp; prop.CanWrite)
{
//
var sourceValue = row[col.ColumnName];
if(!(sourceValue is DBNull))
prop.SetValue(record, Parse(prop.PropertyType, sourceValue.ToString()));
}
}
((IList<T>)records).Add(record);
}
}
}
finally
{
if (reader != null) reader.Dispose();
if (streamReader != null) streamReader.Dispose();
if (memoryStream != null) memoryStream.Dispose();
}
break;
default:
throw new ImportException("Template is not valid.");
}
return records;
}
Я использую метод CreateOpenXmlReader для файла xlsx, как это было предложено на
stackoverflow.
табл.строк.Количество равно нулю — из более чем 1700 строк в файле xlsx. Пожалуйста, помогите
Комментарии:
1. Какова версия вашей библиотеки ExcelDataReader? — Я думаю, ваш код должен работать нормально. Для большей наглядности, пожалуйста, поделитесь с нами своим файлом Excel — HTH ;).
2. Вероятно, это была ошибка в ExcelDataReader версии 3.5.0, поскольку исправлена в версии 3.6.0 github.com/ExcelDataReader/ExcelDataReader/issues/401