gpt4 book ai didi

c# - 在 EPPlus 中调用 LoadFromCollection 时忽略属性

转载 作者:太空狗 更新时间:2023-10-29 17:34:08 25 4
gpt4 key购买 nike

我正在尝试使用以下代码生成 Excel 文件:

public static Stream GenerateFileFromClass<T>(IEnumerable<T> collection, int startrow, int startcolumn, byte[]templateResource)
{
using (Stream template = new MemoryStream(templateResource))//this is an excel file I am using for a base/template
{
using (var tmpl = new ExcelPackage(template))
{
ExcelWorkbook wb = tmpl.Workbook;
if (wb != null)
{
if (wb.Worksheets.Count > 0)
{
ExcelWorksheet ws = wb.Worksheets.First();
ws.Cells[startrow, startcolumn].LoadFromCollection<T>(collection, false);
}
return new MemoryStream(tmpl.GetAsByteArray());
}
else
{
throw new ArgumentException("Unable to load template WorkBook");
}
}
}
}

然而,这就像一种款待。我想忽略我的类集合中的几个属性,因此它与我的模板相匹配。我知道 LoadFromCollection 将根据类的公共(public)属性在 Excel 文件中生成列,但是当我使用 Entity Framework 加载类时,如果我将字段标记为私有(private),EF 会提示- 主要是因为我不想显示的字段之一是 key 。

我曾尝试使用 [XmlIgnore] 标记我不想使用的属性,但没有成功。有没有办法做到这一点,除了将整个集合加载到数据集或类似的数据集中并从中修剪列?还是转换为没有我不需要的属性的基类?

最佳答案

是的,EPPlus 提供了 .LoadFromCollection<T>() 的重载使用 MemberInfo[] 的方法您希望包含的属性的参数。

这为我们提供了忽略具有特定属性的任何属性所需的一切。

例如,如果我们想忽略具有此自定义属性的属性:

public class EpplusIgnore : Attribute { }

然后我们可以写一点扩展方法来首先找到所有MemberInfo没有 [EpplusIgnore] 的属性对象属性然后返回 .LoadFromCollection 的正确重载的结果EPPlus dll 中的方法。

像这样:

public static class Extensions
{
public static ExcelRangeBase LoadFromCollectionFiltered<T>(this ExcelRangeBase @this, IEnumerable<T> collection) where T:class
{
MemberInfo[] membersToInclude = typeof(T)
.GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(p=>!Attribute.IsDefined(p,typeof(EpplusIgnore)))
.ToArray();

return @this.LoadFromCollection<T>(collection, false,
OfficeOpenXml.Table.TableStyles.None,
BindingFlags.Instance | BindingFlags.Public,
membersToInclude);
}

}

因此,例如,像这样使用它会忽略 .Key导出 Person 时的属性收集到 excel:

public class Person
{
[EpplusIgnore]
public int Key { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}

class Program
{
static void Main(string[] args)
{
var demoData = new List<Person> { new Person { Key = 1, Age = 40, Name = "Fred" }, new Person { Key = 2, Name = "Eve", Age = 21 } };

FileInfo fInfo = new FileInfo(@"C:\Temp\Book1.xlsx");
using (var excel = new ExcelPackage())
{
var ws = excel.Workbook.Worksheets.Add("People");
ws.Cells[1, 1].LoadFromCollectionFiltered(demoData);

excel.SaveAs(fInfo);
}
}
}

给出我们期望的输出:

enter image description here

关于c# - 在 EPPlus 中调用 LoadFromCollection 时忽略属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25603492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com