Допустим, есть Excel и класс, который содержит в себе поля из Excel.
Поля в классе на английском, а в Excel на русском.
Как бы красиво это сделать с учетом того, что порядок в Excel может быть нарушен?
Решение в лоб, это идти по таблице сверху вниз и через if делать нужно присвоение, но это некрасиво.
Есть идея сосздать статичный словарь и перечислить в нем <название класс, название поля в Excel>, а потом через рефлексию делать присвоение нужному полю, но мне кажется, что есть путь легче.
Вот такая у меня штука получилась через рефлексию:
public class TestReport
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public int Prop3 { get; set; }
//Словарь как Свойство отражается на поле в Экселе
private static Dictionary<string, string> _mapDictionary = new Dictionary<string, string>()
{
{"Prop1","Проп1" },
{"Prop2","Проп2" },
{"Prop3","Проп3" }
};
//Получаем словарь Эксель-Индекс:Название свойства
static Dictionary<int, string> MapingColumns(ExcelWorksheet ws)
{
Dictionary<int, string> indexMapDict = new Dictionary<int, string>();
for (var i = 1; i <= ws.Dimension.Columns; i++)
{
var key = _mapDictionary.FirstOrDefault(x => x.Value == ws.Cells[1, i].Text).Key;
indexMapDict.Add(i, key);
}
return indexMapDict;
}
//Собственное присваиваем по имени.
static void SetValue(TestReport dr, string propName, object value)
{
var prop = dr.GetType().GetProperty(propName, BindingFlags.Public | BindingFlags.Instance);
if (prop.PropertyType != value.GetType())
{
try
{
value = Convert.ChangeType(value, prop.PropertyType);
}
catch (Exception ex)
{
value = prop.PropertyType.IsValueType ? Activator.CreateInstance(prop.PropertyType) : null;
}
}
prop.SetValue(dr, value);
}
public static List<TestReport> GetTestReportFromExcel(string pathToExcel)
{
List<TestReport> result = new List<TestReport>();
if (Path.GetExtension(pathToExcel) == ".xls")
{
pathToExcel = ConvertToXlsx(pathToExcel);
}
using (ExcelPackage pack = new ExcelPackage(new FileInfo(pathToExcel)))
{
var ws = pack.Workbook.Worksheets["Тест"];
var indexMapDict = MapingColumns(ws);
for (int i = 2; i <= ws.Dimension.Rows; i++)
{
var dt = new TestReport();
for (int j = 1; j <= ws.Dimension.Columns; j++)
{
SetValue(dt, indexMapDict[j], ws.Cells[i, j].Value);
}
}
}
return result;
}
}
Но может быть есть путь изящнее?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Есть стандартная таблица пользователей фреймворка Identity 22
Пытаюсь реализовать сервер за NAT с помощью STUNВкратце, делаю так: