我正在尝试创建一个接受通用List<T>
的函数,并迭代返回excel文件byte[]
的列表。该函数需要能够确定对象属性。因此,如果我传递List<person>
并且人具有属性first,last,age等,我需要能够确定属性名称以创建excel列标题然后我需要迭代列表以分配列单元格的属性值。任何人都可以给我一些示例代码,以便在泛型函数中使用List<T>
吗?
答案 0 :(得分:9)
除此之外:以已知顺序恢复列: 没有为成员定义的订单,除了您创建的订单。例如(from MSDN):
GetProperties方法不以特定顺序返回属性,例如按字母顺序或声明顺序。您的代码不得依赖于返回属性的顺序,因为该顺序会有所不同。
如果您不需要依赖订单,可以使用Reflection或TypeDescriptor;例如(注意这写TSV文本,而不是byte[]
- 我的解释是问题是获取数据,而不是写Excel):
static void WriteTsv<T>(this IEnumerable<T> data, TextWriter output)
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
foreach (PropertyDescriptor prop in props)
{
output.Write(prop.DisplayName); // header
output.Write("\t");
}
output.WriteLine();
foreach (T item in data)
{
foreach (PropertyDescriptor prop in props)
{
output.Write(prop.Converter.ConvertToString(
prop.GetValue(item)));
output.Write("\t");
}
output.WriteLine();
}
}
如果您需要订单,则需要:
params string[] propertyNames
)上述TypeDescriptor
方法具有以下优势(超过GetType().GetProperties()
):
DataView
,例如,如果您使用IList
)答案 1 :(得分:0)
最简单的方法可能是convert your List to a DataTable,然后是convert the DataTable to an Excel spreadsheet。
第二个链接将电子表格直接写入ASP.NET响应,这可以很容易地适应返回一个byte []。
答案 2 :(得分:0)
使用您的收藏集支持的界面,例如IEnumerable
:
public byte[] Process(IEnumerable input) {
foreach (var elem in input) {
foreach (PropertyInfo prop in elem.GetType().GetProperties()) {
Object value = prop.GetValue(elem, null);
// add value to byte[]
}
}
return bytes;
}