2015-03-30 3 views
1

Я использую EPPlus для создания помощника «Экспорт в Excel». Это будет в основном принимать анонимный список и использовать этот список для заполнения электронной таблицы.Итерация над свойствами объекта анонимного типа

Я хочу, чтобы иметь возможность перебирать свойства объекта списка и определять, что является datetime и соответствующим образом форматировать эту колонку. Код, который у меня ниже, работает, однако есть более сжатый способ написать это - особенно там, где я не зависим от вытаскивания объекта из списка и работы с этим объектом (т. Е. Я получаю типы свойств из самого списка)?

private static string[] columnIndex = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z".Split(','); 
    private static ExcelWorksheet CreateAndFormatWorksheet<T>(OfficeOpenXml.ExcelPackage pck, List<T> dataSet) 
    { 
     ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Monet_Export_" + DateTime.Now.ToString()); 
     ws.Cells["A1"].LoadFromCollection(dataSet, true); 

     if (dataSet.Count > 0) 
     { 
      // Pull first list item to determine so we have something to iterate over below 
      dynamic first = dataSet[0]; 

      // List count == upper row count for the spreadsheet 
      string rowCount = dataSet.Count.ToString(); 

      int i = 0; 
      foreach (PropertyInfo info in first.GetType().GetProperties()) 
      { 
       if (info.PropertyType == typeof(DateTime)) 
       { 
        string column = columnIndex[i]; 
        string indexer = column + "2:" + column + rowCount; 
        ws.Cells[indexer].Style.Numberformat.Format = "mm/dd/yyyy"; 
       } 
       else if (info.PropertyType == typeof (int)) 
       { 
        string column = columnIndex[i]; 
        string indexer = column + "2:" + column + rowCount; 
        ws.Cells[indexer].Style.Numberformat.Format = "@";       
       } 

       i++; 
      }     
     } 

     return ws; 
    } 
+0

Боковой узел, вы можете изменить переменную 'columnIndex' в массив символов:' private static char [] columnIndex = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" .ToCharArray(); 'и впоследствии ваша переменная' column' для символа. –

ответ

3

Вы можете получить свойства типа T с typeof(T).GetProperties(). Это также работает с анонимными типами.

Тогда вам не нужно вытаскивать первый элемент, чтобы проверить его свойства, и вам не нужно проверять наличие dataSet.Count > 0 (если вы хотите разрешить пустую таблицу).

Смежные вопросы