Epplus - LoadFromCollection и порядок столбцов

Я использую метод LoadFromCollection, чтобы заполнить Excel списком. Однако столбцы Excel должны иметь определенный порядок, чтобы обеспечить лучший контекст для пользователя, поэтому я пытаюсь выяснить, как этого добиться.

Один из вариантов - установить порядок параметров внутри класса, но я избегаю этого, потому что кто-то другой может изменить их порядок, и это повлияет на мой код.

Второй вариант - использовать Linq:

var orderedColumns = (from p in myList 
                     select new { p.Name, p.Age, ...}).ToList();

Таким образом, я также могу определить порядок столбцов, но мне не нравится идея создания анонима, когда у меня уже есть список, готовый для использования (я также теряю атрибут DisplayNameAttribute, который я определил для класса).

Ребята, у вас есть идеи? Возможно, я мог бы использовать MemberInfo[]?

1 ответ

Я нашел решение, которым я поделюсь с вами, ребята.

public class MyClass
{
   [DataMember(Order = 1)]
   public string PropertyA;

   [DataMember(Order = 2)]
   public int PropertyB

   [DataMember(Order = 0)]
   public bool propertyC
}

С таким кодом, если у меня есть List<MyClass> и использовать LoadFromCollection() из Epplus в результирующем Excel будут показаны столбцы в порядке их появления в классе:

PropertyA | PropertyB | PropertyC

Чтобы решить эту проблему, мы можем сделать следующее:

var orderedProperties = (from property in typeof(MyClass).GetProperties()
                         where Attribute.IsDefined(property, typeof(DataMemberAttribute))
                         orderby ((DataMemberAttribute)property
                                  .GetCustomAttributes(typeof(DataMemberAttribute), false)
                                  .Single()).Order
                         select property);

var ws = p.Workbook.Worksheets.Add("MySheet");
ws.Cells[1, 1].LoadFromCollection(myClassCollection, true, OfficeOpenXml.Table.TableStyles.Light1
   ,System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public
   ,orderedProperties.ToArray());

Получившийся Excel покажет этот порядок столбцов:

PropertyC | PropertyA | PropertyB

Примечание: только столбцы с [DataMember(Order = x)] атрибут будет отображаться в Excel, но я также хотел добиться этого, потому что в моем классе есть некоторые столбцы, которые я не хочу показывать в Excel.

Кредиты @Sanjay за упоминание атрибута DataMember.

Другие вопросы по тегам