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

我正在尝试创build一个接受通用List<T>的函数,并迭代返回Excel文件byte[]的列表。 该function需要能够确定对象的属性。 所以,如果我通过List<person>和人有属性第一,最后,年龄等,我需要能够确定属性名称,以创buildExcel列标题,然后我需要迭代列表分配属性值列的单元格。 任何人都可以指向我的一些示例代码来处理通用函数中的List<T>

除此之外:用于按照已知的顺序获取列:除了创build的成员之外,没有为成员定义的顺序。 例如( 来自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 (如果你这样做的话很有用)

最简单的方法可能是将List转换为DataTable ,然后将DataTable转换为Excel电子表格 。

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

使用您的集合支持的接口,如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; } 
    Interesting Posts