Как сортировать столбцы при сериализации свойств класса при использовании с Epplus - PullRequest
1 голос
/ 01 октября 2019

Я использую библиотеку Epplus для экспорта данных из коллекции в файл Excel. Я хочу, чтобы выходные данные были расположены в порядке атрибутов, указанных в классе. Я узнал, что есть DataMember, но он используется только в WCF. И я разрабатываю приложение с использованием WPF

1 Ответ

1 голос
/ 02 октября 2019

Вы просите отсортировать строку по атрибутам в двоеточиях? Или вы на самом деле хотите отсортировать столбцы, как они представлены. В любом случае нет атрибута, который вы можете использовать, так как Epplus изначально поддерживает AFAIK.

Если вы хотите отсортировать строки по столбцам, посмотрите на функцию Sort, которую они добавили несколько лет назад:

https://github.com/JanKallman/EPPlus/blob/4dacf27661b24d92e8ba3d03d51dd5468845e6c1/EPPlus/ExcelRangeBase.cs#L2934

Но из того, что выописать, вы хотите фактически отсортировать порядок столбцов при экспорте коллекции things с чем-то вроде 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()
{
    ///12848075/kak-sortirovat-stolbtsy-pri-serializatsii-svoistv-klassa-pri-ispolzovanii-s-epplus

    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();
    }
}

, что дает следующее:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...