我有一个应用程序,用户可以输入大量数据字段,然后希望通过对数据的自定义查询来生成Excel电子表格。
对于单表查询,我可以返回IEnumerable<T>
并在EPPlus中使用LoadFromCollection()
方法来创建仅包含请求列的电子表格,例如:
List<string> fieldNames = userFieldsParam;
var data = Entities.MainStatements
.Where(ms => ms.FinancialYear.YearString == finYearParam);
var displayFields = typeof(MainStatements).GetMembers()
.Where(st => fieldNames.Contains(st.Name)).ToList();
worksheet.Cells["a2"].LoadFromCollection(data, false, OfficeOpenXm.Table.TableStyles.None,
BindingFlags.Default, displayFields.ToArray());
但是,当用户的查询跨越相关表时,我的查询将返回一个动态类(不是IEnumerable<T>
),该类不会加载。
var data = Entities.MainStatements
.Include(RevenueStatements)
.Include(ExpenditureStatements)
.Where(ms => ms.FinancialYear.YearString == finYearParam)
.Select(fieldNamesString);
我尝试使用(OP's)解决方案here,方法是返回带有所有列(包括.Include
d个表列)的IEnumerable,但无法弄清楚如何从相关列获取MemberInfo数据。表。首先,我尝试将表名称包括在请求的列列表中,但GetMembers()并未添加它们。
接下来,我尝试为每个单独的表创建一个MemberInfo
,但是当我尝试添加表名信息以将它们整理到一个列表中时,我发现MemberInfo
是只读的。
foreach (MemberInfo mi in typeof(RevenueStatements).GetMembers().Where(rs => fieldNames.Contains(rs.Name)))
{
mi.Name = "RevenueStatements." + mi.Name; <-- Property or indexer mi
displayFields.Add(mi);
}
如何使用EPPlus(或其他第三方解决方案)从具有自定义列的多表查询结果中填充Excel电子表格?具体来说,如何告诉EPPlus从相关表中包括哪些列?
答案 0 :(得分:0)
使用结果构建数据表,然后使用EPPlus方法LoadFromDataTable();写入excel。