一个Excel导出类的实现过程(二):显示定制
生活随笔
收集整理的這篇文章主要介紹了
一个Excel导出类的实现过程(二):显示定制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
導出操作中,我們常常不需要顯示所有屬性,比如Person類加入Guid屬性:
public class Person {public Int32 ID { get; set; }public Guid Guid { get; set; }public String Name { get; set; }public DateTime Birth { get; set; }public Double Salary { get; set; } }現在要求傳入字符串數組headers,有什么顯示什么,Type. GetProperty()方法可以取單個屬性,我們加入Export的重載方法如下:
static void Export<T>(IList<T> records, IList<String> headers) {if (records == null)throw new ArgumentNullException("records");if (headers == null || headers.Count == 0)throw new ArgumentNullException("headers");//像headers不可包含null元素、至少包含一個元素、元素不可重復等檢查視需求而定, 下文不重重復 PropertyInfo[] props = new PropertyInfo[headers.Count];for (Int32 i = 0; i < headers.Count; i++){props[i] = typeof(T).GetProperty(headers[i]); //注意可能產生為null的元素 }for (Int32 i = 0; i < headers.Count; i++){Console.Write(headers[i]);Console.Write("\t");}Console.WriteLine();foreach (var record in records){for (Int32 i = 0; i < props.Length; i++){if (props[i] != null) //注意null檢查 {Object value = props[i].GetValue(record, null);Console.Write(value);Console.Write("\t");}}Console.WriteLine();} }第一個方法重構如下:
static void Export<T>(IList<T> records) {if (records == null)throw new ArgumentNullException("records");String[] headers = typeof(T).GetProperties().Select(p => p.Name).ToArray();Export<T>(records, headers); }現在的導出操作,我們只打印提供的屬性數組,同時請注意:小寫的“birth”匹配不到任何屬性。
Export<Person>(persons, new[] { "Name", "birth", "Salary" });繼續加入業務場景,以上代碼使用了屬性名,我們可以更友好,比如將“Name”打印為“名稱”,“Salary”打印成“薪水”——題外話,好像沒啥場景需要打印薪水,Whatever. 加一個輔助的Header類如下,并添加Export重載:
public class Header {public String Name { get; private set; }public String PrintName { get; private set; }public Header(String name): this(name, name){}public Header(String name, String printName){Name = name;PrintName = printName;} }新的Export方法第2個重載與第3個重載分別為:
static void Export<T>(IList<T> records, IList<String> headers) {if (records == null)throw new ArgumentNullException("records");if (headers == null || headers.Count == 0)throw new ArgumentNullException("headers");Header[] newHeaders = typeof(T).GetProperties().Select(p => new Header(p.Name)).ToArray();Export<T>(records, newHeaders); }static void Export<T>(IList<T> records, IList<Header> headers) {if (records == null)throw new ArgumentNullException("records");if (headers == null || headers.Count == 0)throw new ArgumentNullException("headers");PropertyInfo[] props = new PropertyInfo[headers.Count];for (Int32 i = 0; i < headers.Count; i++){props[i] = typeof(T).GetProperty(headers[i].Name); //注意屬性數組仍然可以有元素為null }for (Int32 i = 0; i < headers.Count; i++){Console.Write(headers[i].PrintName);Console.Write("\t");}Console.WriteLine();foreach (var record in records){for (Int32 i = 0; i < props.Length; i++){if (props[i] != null) //注意null檢查 {Object value = props[i].GetValue(record, null);Console.Write(value);Console.Write("\t");}}Console.WriteLine();} }調用邏輯與輸出如下:
List<Header> headers = new List<Header>(); headers.Add(new Header("ID")); headers.Add(new Header("Name", "名稱")); headers.Add(new Header("Salary", "薪水")); Export<Person>(persons, headers); ID 名稱 薪水 1 Rattz 20.2 2 Mike 20.2轉載于:https://www.cnblogs.com/Jusfr/archive/2013/05/16/3082095.html
總結
以上是生活随笔為你收集整理的一个Excel导出类的实现过程(二):显示定制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 演练GridView控件显示目录图片
- 下一篇: Xshell的一些实用技巧