public static IEnumerable<T> GetRecordsFromXlsx<T>(this string path) where T : class, new()
{
var file = new FileInfo(path);
Debug.Assert(!string.IsNullOrWhiteSpace(file.DirectoryName));
Type type = typeof(T);
var properties = type.GetProperties().Where(t => t.IsDefined(typeof(CsvFieldAttribute), true)).ToList();
var headerNames = properties.Select(GetCsvFieldName).ToList();
using (var package = new ExcelPackage(file))
{
ExcelWorksheet sheet = package.Workbook.Worksheets[1];
var rows = sheet.Dimension.End.Row;
var headerCells = sheet.Cells["1:1"];
var query = from headerName in headerNames
join headerCell in headerCells
on headerName equals headerCell.Text
select new
{
Key = headerName,
Value = headerCell.End.Column
};
var nameIndexes = query.ToDictionary(t => t.Key, t => t.Value);
var result = new List<T>();
for (int row = 1; row < rows; row++)
{
var t = new T();
foreach (var property in properties)
{
string csvFiledName = GetCsvFieldName(property);
if (nameIndexes.ContainsKey(csvFiledName))
{
var column = nameIndexes[csvFiledName];
var value = sheet.Cells[row + 1, column].Text;
property.SetValue(t, value, null);
}
}
result.Add(t);
}
return result;
}
}
{
var file = new FileInfo(path);
Debug.Assert(!string.IsNullOrWhiteSpace(file.DirectoryName));
Type type = typeof(T);
var properties = type.GetProperties().Where(t => t.IsDefined(typeof(CsvFieldAttribute), true)).ToList();
var headerNames = properties.Select(GetCsvFieldName).ToList();
using (var package = new ExcelPackage(file))
{
ExcelWorksheet sheet = package.Workbook.Worksheets[1];
var rows = sheet.Dimension.End.Row;
var headerCells = sheet.Cells["1:1"];
var query = from headerName in headerNames
join headerCell in headerCells
on headerName equals headerCell.Text
select new
{
Key = headerName,
Value = headerCell.End.Column
};
var nameIndexes = query.ToDictionary(t => t.Key, t => t.Value);
var result = new List<T>();
for (int row = 1; row < rows; row++)
{
var t = new T();
foreach (var property in properties)
{
string csvFiledName = GetCsvFieldName(property);
if (nameIndexes.ContainsKey(csvFiledName))
{
var column = nameIndexes[csvFiledName];
var value = sheet.Cells[row + 1, column].Text;
property.SetValue(t, value, null);
}
}
result.Add(t);
}
return result;
}
}