转:ASP.NET MVC 将IList<T>导出Excel文档的泛型类

/// <summary>
/// 提供将泛型集合数据导出Excel文档。
/// </summary>
/// <typeparam name="T"></typeparam>
public class ExcelResult<T> : ActionResult where T : new()
{
    public ExcelResult(IList<T> entity, string fileName, bool showDisplayName = true)
    {
        this.Entity = entity;
        this.FileName = fileName;
        this.ShowDisplayName = showDisplayName;
    }
 
    public ExcelResult(IList<T> entity, bool showDisplayName = true)
    {
        this.Entity = entity;
 
        DateTime time = DateTime.Now;
        this.FileName = string.Format("{0}_{1}_{2}_{3}",
            time.Month, time.Day, time.Hour, time.Minute);
        this.ShowDisplayName = showDisplayName;
    }
 
    public IList<T> Entity
    {
        get;
        set;
    }
 
    public string FileName
    {
        get;
        set;
    }
 
    public bool ShowDisplayName
    {
        get;
        set;
    }
 
    public override void ExecuteResult(ControllerContext context)
    {
        if (Entity == null)
        {
            new EmptyResult().ExecuteResult(context);
            return;
        }
 
        SetResponse(context);
    }
 
/// <summary>
/// 设置并向客户端发送请求响应。
/// </summary>
/// <param name="context"></param>
private void SetResponse(ControllerContext context)
{
            StringBuilder sBuilder = ConvertEntity();
            byte[] bytestr = Encoding.Unicode.GetBytes(sBuilder.ToString());
            context.HttpContext.Response.Clear();
            context.HttpContext.Response.ClearContent();
            context.HttpContext.Response.Buffer = true;
            context.HttpContext.Response.Charset = "GB2312";
          //添加中文GB2312格式 
context.HttpContext.Response.ContentEncoding = Encoding.GetEncoding("GB2312");
            context.HttpContext.Response.ContentType = "application/ms-excel";
            context.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ".xls");
            context.HttpContext.Response.AddHeader("Content-Length", bytestr.Length.ToString());
            context.HttpContext.Response.Write(sBuilder);
//添加Flush方法        
context.HttpContext.Response.Flush();
//添加Close方法           
context.HttpContext.Response.Close();
            context.HttpContext.Response.End();
}
 
    /// <summary>
    /// 把泛型集合转换成组合Excel表格的字符串。
    /// </summary>
    /// <returns></returns>
    private StringBuilder ConvertEntity()
    {
        StringBuilder sb = new StringBuilder();
        AddTableHead(sb);
        AddTableBody(sb);
        return sb;
    }
 
    /// <summary>
    /// 根据IList泛型集合中的每项的属性值来组合Excel表格。
    /// </summary>
    /// <param name="sb"></param>
    private void AddTableBody(StringBuilder sb)
    {
        if (Entity == null || Entity.Count <= 0)
        {
            return;
        }
 
        PropertyInfo[] properties = typeof(T).GetProperties();
 
        if (properties.Length <= 0)
        {
            return;
        }
 
        for (int i = 0; i < Entity.Count; i++)
        {
            for (int j = 0; j < properties.Length; j++)
            {
                string sign = j == properties.Length - 1 ? "\n" : "\t";
                object obj = properties[j].GetValue(Entity[i], null);
                sb.Append(obj ?? string.Empty).Append(sign);
            }
        }
    }
 
    /// <summary>
    /// 根据指定类型T的所有属性名称来组合Excel表头。
    /// </summary>
    /// <param name="sb"></param>
    private void AddTableHead(StringBuilder sb)
    {
        PropertyInfo[] properties = typeof(T).GetProperties();
 
        if (properties.Length <= 0)
        {
            return;
        }
 
        for (int i = 0; i < properties.Length; i++)
        {
            string headName = properties[i].Name;
            string sign = i == properties.Length - 1 ? "\n" : "\t";
            if (!ShowDisplayName)
            {
                sb.Append(headName).Append(sign);
                continue;
            }
 
            Attribute attribute = Attribute.GetCustomAttribute(properties[i], typeof(DisplayNameAttribute));
            if (attribute != null)
            {
                DisplayNameAttribute displayNameAttribute = attribute as DisplayNameAttribute;
                if (displayNameAttribute != null && !string.IsNullOrWhiteSpace(displayNameAttribute.DisplayName))
                {
                    headName = displayNameAttribute.DisplayName;
                }
            }
 
            sb.Append(headName).Append(sign);
        }
    }
}

 


调用:
public ActionResult Index()
{
    List<Student> students = new List<Student>();
    for (int i = 1; i <= 100; i++)
    {
        students.Add(new Student
        {
            Name = "Name " + i.ToString(),
            Age = i,
            Address = "Address " + i.ToString()
        });
    }
 
    return new ExcelResult<Student>(students);
}

定义:

public class Student
{
    [DisplayName("姓名")]
    public string Name { get; set; }
    [DisplayName("年龄")]
    public int Age { get; set; }
    [DisplayName("家庭住址")]
    public string Address { get; set; }
}

http://www.cnblogs.com/itbar/archive/2011/10/16/mvc_export_excel.html  ASP.NET MVC 将IList<T>导出Excel文档的泛型类(继承自ActionResult)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值