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.