Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 帮助转换通用列表<;T>;Excel电子表格_C#_Excel_Generic List - Fatal编程技术网

C# 帮助转换通用列表<;T>;Excel电子表格

C# 帮助转换通用列表<;T>;Excel电子表格,c#,excel,generic-list,C#,Excel,Generic List,我正在尝试创建一个函数,该函数接受一个通用的列表,并迭代该列表,返回一个excel文件字节[]。函数需要能够确定对象属性。因此,如果我传递一个列表,并且person具有属性first、last、age等,我需要能够确定属性名称,以便创建excel列标题,然后我需要迭代列表以将属性值分配给列单元格。有人能给我指出一些在通用函数中使用List的示例代码吗?那么,最简单的方法可能是 第二个链接将电子表格直接写入ASP.NET响应,这可以很容易地调整为返回字节[]。旁白:为了以已知顺序返回列:除了您创建

我正在尝试创建一个函数,该函数接受一个通用的
列表
,并迭代该列表,返回一个excel文件
字节[]
。函数需要能够确定对象属性。因此,如果我传递一个
列表
,并且person具有属性first、last、age等,我需要能够确定属性名称,以便创建excel列标题,然后我需要迭代列表以将属性值分配给列单元格。有人能给我指出一些在通用函数中使用
List
的示例代码吗?

那么,最简单的方法可能是


第二个链接将电子表格直接写入ASP.NET响应,这可以很容易地调整为返回字节[]。

旁白:为了以已知顺序返回列:除了您创建的顺序之外,没有为成员定义的顺序。例如():

GetProperties方法不按特定顺序返回属性,如字母顺序或声明顺序。您的代码不能依赖于返回属性的顺序,因为该顺序是不同的

如果您不需要依赖顺序,反射或TypeDescriptor都可以;例如(注意这会写入TSV文本,而不是
byte[]
——我的解释是问题在于获取数据,而不是写入Excel):

static void WriteTsv(此IEnumerable数据,TextWriter输出)
{
PropertyDescriptorCollection props=TypeDescriptor.GetProperties(typeof(T));
foreach(PropertyDescriptor道具中的道具)
{
output.Write(prop.DisplayName);//头
输出。写入(“\t”);
}
output.WriteLine();
foreach(数据中的T项)
{
foreach(PropertyDescriptor道具中的道具)
{
输出.写入(prop.Converter.ConvertToString(
道具价值(项目));
输出。写入(“\t”);
}
output.WriteLine();
}
}
如果您需要订购,您需要:

  • 传入(例如,作为
    参数字符串[]propertyNames
  • 在属性上使用属性
  • 使用字母顺序
上面的
TypeDescriptor
方法具有以下优点(优于
GetType().GetProperties()
):

  • 它适用于自定义对象模型(
    DataView
    ,例如,如果使用
    IList
  • 您可以调整实现以提高性能,例如(如果您正在做这项工作,这将非常有用)

使用您的收藏支持的界面,例如
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;
}

我认为Kevin所说的“…财产名称以便创建…”是“…财产名称以便我可以创建…”,而不是财产名称的排序列表:)哦!我感觉很慢。。。我将保持“原样”,因为我认为如果你每次都期望相同的结果,这仍然是一个有趣的观点。谢谢,谢谢,马克,这就是我要找的。
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;
}