一个Excel导出类的实现过程(二):显示定制
2013-05-16 16:30
316 查看
导出操作中,我们常常不需要显示所有属性,比如Person类加入Guid属性:
现在要求传入字符串数组headers,有什么显示什么,Type. GetProperty()方法可以取单个属性,我们加入Export的重载方法如下:
第一个方法重构如下:
现在的导出操作,我们只打印提供的属性数组,同时请注意:小写的“birth”匹配不到任何属性。
继续加入业务场景,以上代码使用了属性名,我们可以更友好,比如将“Name”打印为“名称”,“Salary”打印成“薪水”——题外话,好像没啥场景需要打印薪水,Whatever. 加一个辅助的Header类如下,并添加Export重载:
新的Export方法第2个重载与第3个重载分别为:
调用逻辑与输出如下:
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
相关文章推荐
- 一个Excel导出类的实现过程(四):格式化与若干坑 已补图和代码zip
- 一个Excel导出类的实现过程(一):泛型与反射
- 一个Excel导出类的实现过程(三):NPOI组件
- 一个表中的Id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数,用SQL语句及视图、存储过程分别实现。
- 编写一个程序,实现显示上月、本月电表读数,计算并显示本月用电数。
- 存储过程实现分页显示效果(转至http://www.knowsky.com/344199.html)
- winform如何实现一个窗体显示后,其他的窗体处于不可编辑状态
- 实现小数据量和海量数据的通用分页显示存储过程
- C#实现OleDb方式读取excel并在datagridview中显示
- 使用frame框架,实现一个网页显示多个界面使用js语言,实现事件响应
- 正确的方法去拦截OnNewWindow2实现在同一个窗口显示_target的网页
- 一个窗口里包含一个iframe,点击iframe内的submit按钮,返回的视图总是显示在iframe中,我想要的效果是点击按钮后返回的视图是在浏览器窗口中...?asp.net mvc 的action中,不用js怎么实现??????????
- nodeJs学习过程之一个图片上传显示的例子
- 使用WIN32汇编语言实现一个基本windows窗体的过程分析
- GGrid网页手写签批控件个人实现在页面上自定义显示的一个例子
- 实现小数据量和海量数据的通用分页显示存储过程
- 一个简单的oracle分页存储过程的实现和调用
- EXCEL中,怎么输入一个代号,显示对应的内容,输入和显示都在同一单元格
- 三种方法实现从“一个(组)查询过程中返回两个表的查询结果”
- 嵌入式视频监控毕业设计过程中保存的标签。。。嵌入式系统视频信号接收、显示 与存储程序设计与实现