Epplus - LoadFromCollection 和列顺序



我正在使用方法LoadFromCollection用List填充excel。但是,excel 列需要有一定的顺序才能为用户提供更好的上下文,所以我正在尝试找出如何完成此操作。

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

我的第二个选项是使用 Linq:

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

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

你们有什么想法吗?也许我可以使用会员信息[]?

我找到了一个解决方案,我将与你们分享。

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 中显示的。

提及 DataMember 属性的功劳@Sanjay。

相关内容

  • 没有找到相关文章

最新更新