Вы просите отсортировать строку по атрибутам в двоеточиях? Или вы на самом деле хотите отсортировать столбцы, как они представлены. В любом случае нет атрибута, который вы можете использовать, так как 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();
}
}
, что дает следующее: