C#导出泛型IList到Excel

原创 2013年12月05日 16:35:19
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace WebApp.Test
{
    /// <summary>
    /// List<T>导出类
    /// </summary>
    /// <typeparam name="T">列表中的元素类型</typeparam>
    public class ExcelHelperForIList<T>
    {
        /// <summary>
        /// 泛型导出Excel
        /// </summary>
        /// <param name="lt">要导出的List集合</param>
        /// <param name="fileName">文件名</param>
        /// <param name="fieldNames">导出的字段名()</param>
        /// <param name="showNames">Excel标题行(需与FieldNames对应)</param>
        /// <returns></returns>
        public static string CreateAdvExcel(IList<T> lt, string fileName, string[] fieldNames, string[] showNames)
        {
            StringBuilder builder = new StringBuilder();
            Random rn = new Random();
            string name = fileName;
            //通过反射得到对象的属性集合  
            System.Reflection.PropertyInfo[] myPropertyInfo = lt.First().GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
            int i = 0, j;
            for (int m = 0; m < fieldNames.Length; m++)
            {
                //遍历属性集合生成excel的表头标题  
                for (i = 0, j = myPropertyInfo.Length; i < j; i++)
                {
                    System.Reflection.PropertyInfo pi = myPropertyInfo[i];
                    string headname = pi.Name;//单元格头部
                    if (headname == fieldNames[m])
                    {
                        builder.Append(showNames[m]);
                        builder.Append("\t");
                    }
                }
            }
            builder.Append("\n");
            //遍历集合生成excel的行集数据
            foreach (T item in lt)
            {
                if (lt == null)
                {
                    continue;
                }
                for (int m = 0; m < fieldNames.Length; m++)
                {
                    for (i = 0, j = myPropertyInfo.Length; i < j; i++)
                    {
                        PropertyInfo pi = myPropertyInfo[i];
                        if (pi.Name == fieldNames[m])
                        {
                            string str = string.Format("{0}", pi.GetValue(item, null)).Replace("\n", "");
                            str = str.Replace(" ", " ");
                            if (str == "")
                            {
                                builder.Append("\t");
                            }
                            else
                            {
                                builder.Append(str + "\t");//横向跳到另一个单元格
                            }
                        }
                    }
                }

                builder.Append("\n");//换行
            }
            StringWriter sw = new StringWriter();
            sw.WriteLine(builder);
            sw.Close();

            HttpContext.Current.Response.Clear();
            // 指定返回的是一个不能被客户端读取的流,必须被下载
            HttpContext.Current.Response.ContentType = "application/ms-excel";
            HttpContext.Current.Response.Charset = "UTF-8";
            HttpContext.Current.Response.Buffer = true;
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            HttpContext.Current.Response.AddHeader("Content-Disposition", string.Format("attachment;filename={0}.xls", name));
            HttpContext.Current.Response.Write(builder);
            HttpContext.Current.Response.End();
            return builder.ToString();
        }
    }
}
在网上找了一些方法但是最终整理成这个类,代码可能有冗余,尚在研究当中,同时也希望同志们指点一二。

使用反射实现通用的POI导出Excel

使用反射实现通用的POI导出Excel整理出来的实用的工具类,使用POI实现数据导出到excel,平时导出Excel都是写死的,今天特意整理出来一篇通用的导出Excel方法。使用的Java反射机制 ...
  • chance2015
  • chance2015
  • 2017年03月12日 15:18
  • 582

java 通用导出一个excel

java导出Excel通用方法,只需要一个list 集合。 package oa.common.utils; import java.io.OutputStream; import java.u...
  • qq_25214695
  • qq_25214695
  • 2016年06月16日 15:12
  • 323

C# 泛型理解之大白话

泛型:泛就是多,许多,很多的意思;型:就是类型,比如:int、float、double等等的数据类型;连接起来就是许多不同的数据类型,包括内置数据类型:就是系统自带,定义好的;自定义类型:就是自己定义...
  • Rose_Girls
  • Rose_Girls
  • 2015年10月09日 23:35
  • 1237

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员...
  • zdhlwt2008
  • zdhlwt2008
  • 2016年04月29日 09:28
  • 4089

C#三十二 泛型的理解和使用

日常生活中的事物都是有类型的,比如我们说“一个女人”,那么“女”就是这个人的类型。我们可以说“女人都是水做的”,那么听者都知道这是在说“女”这种类型的人。再比如你去肉店买肉,你可以对老板说“我要十斤猪...
  • zhangchen124
  • zhangchen124
  • 2016年05月11日 21:52
  • 5049

C#学习日记30---泛型类、泛型方法、泛型委托

泛型允许您延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,在声明类或方法的时候由于不知道用户要传入什么样类型的参数,所以在传入类型的地方“挖一个坑(“<T>”)"...
  • HC666
  • HC666
  • 2015年10月23日 21:57
  • 3241

浅谈Java和C#泛型及C++模板

最近偶然接触到了类型擦除(TypeErasure)这个概念。通过查了一些资料才知道Java和C#的泛型是有一些区别的,当然与C++的模板也不一样。因此做了如下整理。 泛型的本质就是让你的类型能够拥有...
  • jackliu91
  • jackliu91
  • 2014年11月24日 18:29
  • 1121

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法?
  • phker
  • phker
  • 2016年06月21日 08:37
  • 1108

C#和java中泛型的本质区别

转自: 为什么JVM上没有C#语言?浅谈Type Erasure特性 每次提到语言的时候我总是忍不住骂Java是一门生产力低下,固步自封的语言——这估计要一直等到Java语言被JVM上...
  • u012780317
  • u012780317
  • 2016年06月17日 11:46
  • 935

C#泛型好处知多少

1.性能 性能是泛型的一个主要优点。 直接上例子,通过实例可以让我们很好的理解这一点。 Stopwatch stopwatch = new Stopwatch(); stopwatch.Start()...
  • tiana0
  • tiana0
  • 2013年09月01日 12:00
  • 2945
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#导出泛型IList到Excel
举报原因:
原因补充:

(最多只允许输入30个字)