【问题标题】:Epplus - LoadFromCollection and column orderEpplus - LoadFromCollection 和列顺序
【发布时间】: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)] 定义类中成员的顺序

标签: c# epplus epplus-4


【解决方案1】:

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

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 属性。

【讨论】:

  • 您好,我检查您是否可以使用任何类型的属性来实现这一点,我建议使用更通用的属性,例如 DisplayAttribute。
  • @Pedro Faustino 的回答有效,我也尝试过 DisplayAttribute 和 Order 组合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多