C# 与Epplus一起使用时,如何在序列化类的属性时对列进行排序

C# 与Epplus一起使用时,如何在序列化类的属性时对列进行排序,c#,serialization,epplus,C#,Serialization,Epplus,我正在使用Epplus库将集合中的数据导出到excel文件。我希望输出按类中指定的属性顺序排列。我确实发现有DataMember,但它只在WCF中使用。我正在使用WPF开发一个应用程序,您是否要求根据colunns中的属性对行进行排序?或者,您真的希望在输出列时对它们进行排序吗。在这两种情况下,您都无法使用Epplus本机支持AFAIK的属性 如果要按列对行进行排序,请查看几年前添加的sort函数: 但是,从您描述的内容来看,您希望在导出对象的集合时,使用类似于LoadFromCollecti

我正在使用Epplus库将集合中的数据导出到excel文件。我希望输出按类中指定的属性顺序排列。我确实发现有DataMember,但它只在WCF中使用。我正在使用WPF开发一个应用程序,您是否要求根据colunns中的属性对行进行排序?或者,您真的希望在输出列时对它们进行排序吗。在这两种情况下,您都无法使用Epplus本机支持AFAIK的属性

如果要按列对行进行排序,请查看几年前添加的
sort
函数:

但是,从您描述的内容来看,您希望在导出
对象的集合时,使用类似于
LoadFromCollection
的方法对列的顺序进行实际排序。您可以轻松创建自己的属性,然后使用 使用获取
MemberInfo
集合的重载:

public class ExportOrderAttribute : Attribute
{
    public ExportOrderAttribute(int order)
    {
        Order = order;
    }

    public int Order { get; set; }
}

public class TestObject
{
    /// <summary>
    /// Best to make static to avoid repeat calls to Reflections (if possible).
    /// </summary>
    public static MemberInfo[] MemberSortInfo { get; } = typeof(TestObject)
        .GetProperties()
        .Select(pi => new
        {
            Property = pi,
            Attribute = (ExportOrderAttribute) Attribute.GetCustomAttribute(
                pi
                , typeof(ExportOrderAttribute)
                , true
            )
        })
        .OrderBy(a => a.Attribute?.Order ?? -1)
        .Select(a => a.Property)
        .Cast<MemberInfo>()
        .ToArray();

    [ExportOrder(4)]
    public int IntCol1 { get; set; }

    [ExportOrder(3)]
    public int IntCol2 { get; set; }

    [ExportOrder(2)]
    public string StringCol { get; set; }

    [ExportOrder(1)]
    public DateTime DateCol { get; set; }

    [ExportOrder(0)]
    public int IntCol3 { get; set; }
}

[TestMethod]
public void Sort_Column_Output()
{
    //https://stackoverflow.com/questions/58177582/how-to-sort-columns-when-serializing-the-properties-of-a-class-when-used-with-ep

    var rnd = new Random();

    var testObjects = Enumerable
        .Range(0, 10)
        .Select(i => new TestObject
        {
            IntCol1 = i,
            IntCol2 = i * 10,
            StringCol = Path.GetRandomFileName(),
            DateCol = DateTime.Now.AddDays(rnd.Next(0, 100)),
            IntCol3 = rnd.Next(100, 10000)
        })
        .ToList();

    var fi = new FileInfo("c:\\temp\\Sort_Column_Output.xlsx");
    if (fi.Exists)
        fi.Delete();

    using (var pck = new ExcelPackage(fi))
    {
        var worksheet = pck.Workbook.Worksheets.Add("Sheet1");

        worksheet.Cells.LoadFromCollection(
            testObjects
            , true
            , TableStyles.None
            , BindingFlags.Instance | BindingFlags.Public
            , TestObject.MemberSortInfo  //CONTROLS THE SORTING
        );

        pck.Save();
    }
}
公共类ExportOrderAttribute:属性
{
公共ExportOrderAttribute(整数顺序)
{
订单=订单;
}
公共整数顺序{get;set;}
}
公共类测试对象
{
/// 
///最好进行静态设置,以避免重复调用反射(如果可能)。
/// 
public static MemberInfo[]MemberSortInfo{get;}=typeof(TestObject)
.GetProperties()
.选择(pi=>new
{
属性=pi,
Attribute=(ExportOrderAttribute)Attribute.GetCustomAttribute(
圆周率
,typeof(ExportOrderAttribute)
是的
)
})
.OrderBy(a=>a.Attribute?.Order???-1)
.Select(a=>a.Property)
.Cast()
.ToArray();
[出口令(4)]
公共int IntCol1{get;set;}
[出口令(3)]
公共int IntCol2{get;set;}
[出口令(2)]
公共字符串StringCol{get;set;}
[出口令(1)]
公共日期时间日期列{get;set;}
[出口令(0)]
公共int IntCol3{get;set;}
}
[测试方法]
公共void排序\列\输出()
{
//https://stackoverflow.com/questions/58177582/how-to-sort-columns-when-serializing-the-properties-of-a-class-when-used-with-ep
var rnd=新随机数();
var testObjects=可枚举
.范围(0,10)
.Select(i=>newtestobject
{
IntCol1=i,
IntCol2=i*10,
StringCol=Path.GetRandomFileName(),
DateCol=DateTime.Now.AddDays(rnd.Next(01100)),
IntCol3=rnd.Next(10010000)
})
.ToList();
var fi=new FileInfo(“c:\\temp\\Sort\u Column\u Output.xlsx”);
如果(fi.存在)
fi.删除();
使用(var pck=新的ExcelPackage(fi))
{
var工作表=pck.工作簿.Worksheets.Add(“表1”);
工作表.Cells.LoadFromCollection(
测试对象
是的
,表样式。无
,BindingFlags.Instance | BindingFlags.Public
,TestObject.MemberSortInfo//控制排序
);
pck.Save();
}
}
因此:


答案正是我需要的。它工作准确高效。再一次,让我学会了很多问题思考