使用EPPlus将动态查询结果导出到Excel

时间:2019-02-04 09:28:55

标签: c# generics epplus dynamic-linq

我有一个应用程序,用户可以输入大量数据字段,然后希望通过对数据的自定义查询来生成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从相关表中包括哪些列?

1 个答案:

答案 0 :(得分:0)

使用结果构建数据表,然后使用EPPlus方法LoadFromDataTable();写入excel。