马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

c#将List对象集合保存为Excel并下载到本地

[复制链接]
查看4911 | 回复1 | 2015-4-29 09:30:14 | 显示全部楼层 |阅读模式
      此方法是把List从Web服务器上下载到本地并保存为Excel的,其中lt是要保存的数据源,fileName是对应的文件名,可以直接写为要保存的类名,
fields对应于要保存的类的字段名,这个一定要正确,否则无法在类里找到该字段,titles是要保存的文件里面的列名,fields和titles必须一一对应,个数要相等。

  保存之前有做特殊处理,比如如果要保存的类里面有枚举的话,直接保存到Excel里会变成英文的,这一般不是用户想看到的,那么需要在枚举的每个值前面标注[Description("***")],

GPMSKernel.Unility.Enums.GetEnumDescription可以获得枚举的Description值;如果是布尔值的话,直接保存就变成了"True"或"False"了,我把这种转换成了"是"或"否";如果要保存的类里面还有特殊的类,那么需要在这特殊的类里面重写ToString方法,保存的时候将会按照该ToString方法保存....



[C#] 纯文本查看 复制代码
/// <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 == 0)
        {
            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();
    }

C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
wibc | 2015-5-8 23:53:13 | 显示全部楼层
学习了,谢谢
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则