Epplus-LoadFromCollection和列顺序

时间:2018-09-28 14:57:10

标签: epplus epplus-4

我正在使用LoadFromCollection方法使用列表填充Excel。但是,excel列需要有一定顺序才能为用户提供更好的上下文,因此我正在尝试找出实现方法。

我要选择的一个选项是设置类内参数的顺序,但是我避免这样做,因为其他人可以更改其顺序,这会影响我的代码。

第二个选择是使用Linq:

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

这样,我也可以定义列顺序,但是我不喜欢在已经准备好使用列表时必须创建匿名对象的想法(我也丢失了为该类定义的DisplayNameAttribute)

你们有什么想法吗?也许我可以使用MemberInfo []?

1 个答案:

答案 0 :(得分:0)

我找到了可以与大家分享的解决方案。

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

   [DataMember(Order = 2)]
   public int PropertyB

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

使用这样的代码,如果我有一个List<MyClass>并使用Epplus中的LoadFromCollection(),则生成的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属性而致谢。