【发布时间】:2018-09-28 14:57:09
【问题描述】:
我正在使用 LoadFromCollection 方法用列表填充 excel。但是,excel 列需要有一定的顺序才能为用户提供更好的上下文,所以我正在尝试找出如何实现这一点。
我的一个选择是在类中设置参数的顺序,但我避免这样做,因为其他人可以更改他们的顺序,这会影响我的代码。
我的第二个选择是使用 Linq:
var orderedColumns = (from p in myList
select new { p.Name, p.Age, ...}).ToList();
这样我也可以定义列顺序,但我不喜欢在列表已经准备好使用时必须创建匿名的想法(我也丢失了我为类定义的 DisplayNameAttribute) .
你们有什么想法吗?也许我可以使用 MemberInfo[]?
【问题讨论】:
-
我建议创建一个几乎不定义字段顺序的数组(或 csv 字段)。使用 whis 方式,顺序将始终相同。像 FieldOrder = "Name,Age,..." 您可以将 csv 放在 app.config 中,以便将来更容易维护。这需要更多的代码,但您将获得 100% 的结果。
-
@DanielBlais 抱歉,恐怕我无法理解您的想法。能详细解释一下吗?
-
我所取得的成就是拥有一个 MemberInfo 数组,其中的属性按正确的顺序排列。这是你建议@DanielBlais 的吗?
-
我并没有真正关注 LoadFromCollection,抱歉。这里我将如何在 Linq 中执行此操作:添加
string fieldOrder = "Name,Age,...".Split(',');这将定义顺序。int row = 0; foreach (var p in myList) { foreach (var column in fieldOrder) { int col = 0; worksheet.Cells[row, col++].Value = p.GetType().GetProperty(column).GetValue(p); } row++; } -
您是否尝试过使用 DataMember 订单注释?基本上,您可以使用 [DataMember(Order = 0)] 定义类中成员的顺序