帮助将通用List <t>转换为Excel电子表格</t>

时间:2009-12-02 06:32:32

标签: c# excel generic-list

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

3 个答案:

答案 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
  • 您可以调整性能的实现 - 例如HyperDescriptor(如果您这样做很有用)

答案 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;
}