Я нашел решение, которым я поделюсь с вами, ребята.
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.