当前位置: 首页 > news >正文

转:ASP.NET MVC 将IListT导出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)

转载于:https://www.cnblogs.com/shy1766IT/p/8194338.html

相关文章:

  • 信息惠民政策网络舆情怎么监测的系统技术解决方案
  • 微信扫码登录-JAVA
  • 今日新网络舆情信息监测收集技术解决办法
  • Spring深入研究:方法注入
  • 政企舆情监测软件好不好评判方法及使用功能介绍
  • oracle查看被锁的表和解锁
  • 网络舆情信息传播动态监测查询方法
  • python基础---递归函数 知识点自查填空题
  • 百度平台上的网络舆情信息怎么搜查的方法
  • 互联网舆情数据信息挖掘分析的方法
  • [luoguP3159] [CQOI2012]交换棋子(最小费用最大流)
  • 网络舆情事件发展趋势变化监测分析的方法
  • saltstack安装与配置
  • 网络舆情信息工作怎么做的措施及建议
  • TCP、IP、ARP协议之间的工作关系
  • 30天自制操作系统-2
  • Angularjs之国际化
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Java程序员幽默爆笑锦集
  • Laravel 实践之路: 数据库迁移与数据填充
  • mysql 5.6 原生Online DDL解析
  • Redis中的lru算法实现
  • SSH 免密登录
  • 回顾2016
  • 蓝海存储开关机注意事项总结
  • 什么软件可以剪辑音乐?
  • 实战|智能家居行业移动应用性能分析
  • 思考 CSS 架构
  • 我从编程教室毕业
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 7行Python代码的人脸识别
  • Semaphore
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #include
  • (C#)一个最简单的链表类
  • (二)fiber的基本认识
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET 8.0 发布到 IIS
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET 常见的偏门问题
  • .NET 反射的使用
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET框架设计—常被忽视的C#设计技巧
  • /*在DataTable中更新、删除数据*/
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @JsonSerialize注解的使用
  • @SuppressWarnings(unchecked)代码的作用
  • @在php中起什么作用?
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林