直接附上代码

     /// <summary>
/// 将List保存为Excel
/// </summary>
/// <typeparam name="T">保存的类类型</typeparam>
/// <param name="lt">需要保存的源数据</param>
/// <param name="fileName">保存的文件名称</param>
/// <param name="fields">对应于类的字段名称</param>
/// <param name="titles">对应于Excel的列名</param>
public static void Save<T>(List<T> lt, string fileName, string[] fields, string[] titles)
{
if (lt == null || lt.Count == )
{
throw new ArgumentNullException("数据为空");
} var sb = new StringBuilder();
PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
const string next = "\t"; foreach (var title in titles)
{
sb.Append(title).Append(next);
} var propertys = new List<PropertyInfo>(); foreach (var field in fields)
{
foreach (PropertyInfo prop in props)
{
if (prop.Name.Equals(field))
{
propertys.Add(prop);
break;
}
}
} sb.Append(Environment.NewLine); foreach (T item in lt)
{
foreach (var property in propertys)
{
object value = property.GetValue(item, null); if (property.PropertyType.BaseType == typeof(Enum))
{
sb.Append(GPMSKernel.Unility.Enums.GetEnumDescription(value));
}
else if (property.PropertyType == typeof(Boolean))
{
if ((bool)value)
{
sb.Append("是");
}
else
{
sb.Append("否");
}
}
else
{
sb.Append(value);
} sb.Append(next);
} sb.Append(Environment.NewLine);
} fileName = string.Format("{0}_{1}.xls", DateTime.Now.ToString("yyMMddHHmmss"), fileName);
HttpContext.Current.Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
HttpContext.Current.Response.BinaryWrite(Encoding.UTF8.GetBytes(sb.ToString()));
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}

    此方法是把List从Web服务器上下载到本地并保存为Excel的,其中lt是要保存的数据源,fileName是对应的文件名,可以直接写为要保存的类名,

fields对应于要保存的类的字段名,这个一定要正确,否则无法在类里找到该字段,titles是要保存的文件里面的列名,fields和titles必须一一对应,个数要相等。
  保存之前有做特殊处理,比如如果要保存的类里面有枚举的话,直接保存到Excel里会变成英文的,这一般不是用户想看到的,那么需要在枚举的每个值前面标注[Description("***")],
GPMSKernel.Unility.Enums.GetEnumDescription可以获得枚举的Description值;如果是布尔值的话,直接保存就变成了"True"或"False"了,我把这种转换成了"是"或"否";如果要保存的类里面还有特殊的类,那么需要在这特殊的类里面重写ToString方法,保存的时候将会按照该ToString方法保存....

最新文章

  1. foreach DataTable或Table时要略过第一行。
  2. threading event
  3. Dapper使用方法:dapper-dot-net/Tests/Tests.cs解析(1)方法:TestMultiMapWithConstructor
  4. Python_爬虫1
  5. PHP之关闭网页错误提示
  6. [转]HTML5 classList API
  7. VS 制作安装包小窥
  8. 【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)
  9. 整理下git常用命令
  10. Jquery.ajax dataType参数
  11. Selenium 工作原理
  12. ES5中文分词(IK)
  13. python爬虫之git的团队协作
  14. 019_Mac实用的图像备份工具
  15. python接口自动化测试十七:使用bs4框架进行简单的爬虫
  16. FutureTask源码解析
  17. kubespray -- 快速部署高可用k8s集群 + 扩容节点 scale.yaml
  18. 算法笔记_232:提取拼音首字母(Java)
  19. charles 在mac下 抓取 https包
  20. js根据数组对象中某个元素合并数组

热门文章

  1. Reader与InputStream两个类中的read()的区别
  2. phpcms手机门户相关
  3. java环境配置为1.7jdk为什么cmd java -version查看版本是1.8
  4. mongo-c-driver使用VS2013编译
  5. python3 爬虫
  6. 《sqoop安装和配置》
  7. ios 抓取真机的网络包
  8. [Linux]使用PHP编写Gearman的Worker守护进程
  9. 数据库DBA(3年以内需求)
  10. MSSQL 查询表空间