我正在尝试使用以下代码生成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
将基于类的公共属性在Excel文件中生成列,但由于我正在使用实体框架加载类,如果我将字段标记为私有,然后EF抱怨-主要是因为我不想显示的字段之一是键。
我尝试使用[XmlIgnore]
标记我不想使用的属性,但没有用。有没有什么方法可以做到这一点,除了将整个集合加载到数据集或其他数据集中并从中修剪列之外?或者强制转换到一个没有我不需要的属性的基类?
4条答案
按热度按时间bwitn5fc1#
是的,EPPlus为
.LoadFromCollection<T>()
方法提供了一个重载,并为您希望包含的属性提供了一个MemberInfo[]
参数。这给了我们所有我们需要忽略的具有某个属性的任何属性。
例如,如果我们想忽略具有此自定义属性的属性:
然后,我们可以编写一个小扩展方法,首先查找没有
[EpplusIgnore]
属性的属性的所有MemberInfo
对象,然后在EPPlus dll中返回.LoadFromCollection
方法的正确重载结果。大概是这样的
因此,例如,像这样使用它将在将
Person
集合导出到excel时忽略.Key
属性:给出我们期望的输出:
z2acfund2#
谢谢Stewart_R,基于你的工作,我做了一个新的接收属性名称的:
yrefmtwq3#
从
EPPlus
的5.5版本开始,EpplusIgnore
属性被烘焙到库中。https://github.com/EPPlusSoftware/EPPlus/pull/258我们可以像下面这样使用它。
请注意,
EpplusTable
或EpplusTableColumn
属性是必需的。下面是相关测试用例https://github.com/EPPlusSoftware/EPPlus/blob/develop/src/EPPlusTest/LoadFunctions/LoadFromCollectionAttributesTests.cs的链接
最近,我不得不在一个项目中使用
EPPlus
,我在这篇博客文章https://www.kajanm.com/blog/exporting-data-to-excel-in-c-sharp/中记录了设置pobjuy324#
下面是Stewart_R的答案的简短版本。如果有人使用泛型方法来创建excel,请继续使用下面的方法。
然后像这样调用此方法