如何调整EPPlus导出Excel时继承类属性的排列顺序?
解决EPPlus导出继承类时属性顺序问题
你遇到的这个问题其实是EPPlus默认行为导致的——它通过反射获取属性时,会先拿到子类的属性,再拿到基类的,所以导出后列顺序是c | a | b。下面给你几种可行的解决方案,按需选择:
方案一:手动指定列顺序(最直接)
既然默认顺序不符合需求,我们可以手动创建表头,再逐行填充数据,完全控制列的排列:
using (ExcelPackage package = new ExcelPackage(archivo)) { ExcelWorksheet ws = package.Workbook.Worksheets.Add("Solds"); // 1. 手动设置表头,按你想要的顺序:a、b、c ws.Cells["A3"].Value = "a"; ws.Cells["B3"].Value = "b"; ws.Cells["C3"].Value = "c"; // 2. 逐行填充数据 int row = 4; foreach (var item in lstSolds) { ws.Cells[row, 1].Value = item.a; ws.Cells[row, 2].Value = item.b; ws.Cells[row, 3].Value = item.c; row++; } // 可选:设置表头样式,让它更美观 ws.Cells["A3:C3"].Style.Font.Bold = true; package.Save(); }
方案二:利用特性标记属性顺序(更优雅)
可以给类的属性加上DisplayAttribute(需要引用System.ComponentModel.DataAnnotations),指定Order参数,然后让EPPlus按照这个顺序加载:
首先修改你的类:
using System.ComponentModel.DataAnnotations; public class First { [Display(Order = 1)] public string a { get; set; } [Display(Order = 2)] public string b { get; set; } } public class Second: First { [Display(Order = 3)] public string c { get; set; } }
然后修改导出代码,通过反射获取按Order排序后的属性,再构建列:
using System.ComponentModel.DataAnnotations; using System.Linq; using (ExcelPackage package = new ExcelPackage(archivo)) { ExcelWorksheet ws = package.Workbook.Worksheets.Add("Solds"); // 获取所有属性并按Display.Order排序 var properties = typeof(Second).GetProperties() .Select(p => new { Prop = p, Order = p.GetCustomAttributes(typeof(DisplayAttribute), true) .Cast<DisplayAttribute>() .FirstOrDefault()?.Order ?? int.MaxValue }) .OrderBy(x => x.Order) .Select(x => x.Prop) .ToList(); // 写入表头 int col = 1; foreach (var prop in properties) { ws.Cells[3, col].Value = prop.Name; col++; } // 写入数据 int row = 4; foreach (var item in lstSolds) { col = 1; foreach (var prop in properties) { ws.Cells[row, col].Value = prop.GetValue(item); col++; } row++; } package.Save(); }
方案三:自定义EPPlus的属性排序逻辑
如果你不想手动处理,也可以通过EPPlus的ExcelRange.LoadFromCollection重载,结合自定义的MemberInfo排序器。不过这种方法需要稍微深入一点,前面两种方案已经能满足大部分需求了。
这样修改后,导出的Excel列顺序就会是a | b | c,符合你的预期啦!
内容的提问来源于stack exchange,提问作者Ion
相关产品推荐
相关产品推荐

