Отразить Excel на класс

223
04 апреля 2017, 09:13

Допустим, есть Excel и класс, который содержит в себе поля из Excel.

Поля в классе на английском, а в Excel на русском.

Как бы красиво это сделать с учетом того, что порядок в Excel может быть нарушен?

Решение в лоб, это идти по таблице сверху вниз и через if делать нужно присвоение, но это некрасиво.

Есть идея сосздать статичный словарь и перечислить в нем <название класс, название поля в Excel>, а потом через рефлексию делать присвоение нужному полю, но мне кажется, что есть путь легче.

Answer 1

Вот такая у меня штука получилась через рефлексию:

 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;
        }
        }

Но может быть есть путь изящнее?

READ ALSO
Ошибка входа при разных полях Email и UserName

Ошибка входа при разных полях Email и UserName

Есть стандартная таблица пользователей фреймворка Identity 22

203
Реализация UDP сервера за NAT с помощью STUN

Реализация UDP сервера за NAT с помощью STUN

Пытаюсь реализовать сервер за NAT с помощью STUNВкратце, делаю так:

341
Imagelist неправильная работа

Imagelist неправильная работа

Пишу для себя небольшую программкуПоявилась проблема с imageList

205
Как задать цвет пикселям?

Как задать цвет пикселям?

Мне выдаёт ошибку:

270