Импорт данных *.xlsx через ExcelDataReader с 0 количеством затронутых записей

#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