Epplus - LoadFromCollection и порядок столбцов - PullRequest
0 голосов
/ 28 сентября 2018

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

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

Второй вариант, который я могу использовать, - это использование Linq:

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

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

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

1 Ответ

0 голосов
/ 01 октября 2018

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

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.

...