.net中数据集合导出为Excel(支持泛型及显示字段顺序,可自定义显示列名)

摘要:咳咳~入园快两年,工作也快将近两年了,这才打算写自己在园中的第一篇文章,主要因为之前只是小白一个,肚子里没有什么墨水,现如今,也喝了些许墨水~当然墨水来源也是受益于广大程序猿们的技术分享,感谢,共同进步!

  好了,废话不多说,直接切入今天要分享的主题。

主题:.net中数据集合导出为Excel

背景:如今越来越多的公司开始注重了大数据,公司开始通过数据来分析用户的行为习惯或者某些产品给公司带来的利害,总之这些数据都可以很好的帮助公司做的更好,了解自身的优缺点从而更好的为用户服务获取更大的利益。既然公司明确了方向要做数据,那么这些数据必然需要展示给人们来看,来做数据分析。当然,这些数据仅仅是在页面上显示出来,并不能满足每个想看数据的人,他们都想根据自己的理解使用这些数据来做自己的分析。当然现在最流行的他们都想使用Excel来处理这些数据,所以我们就需要将这些数据导出到Excel中去,来满足众多的用户群体。

内容:因为俺是做.net开发的猿人,所以在这里只分析.net中如何将数据导出Excel文档了。

  首先,我们既然做数据,数据来源必然很多,那么很多地方都需要做数据导出。为了代码的通用性,我们就需要定义一个通用的类DataExportHelper.cs 代码如下:

  public class DataExportHelper
    {
        /// <summary>
        /// 导出EXCEL
        /// </summary>
        /// <typeparam name="T">集合类型</typeparam>
        /// <param name="data">数据集合</param>
        /// <param name="exportFileName">要显示的列名(类字段名)</param>
        /// <param name="columnNames"></param>
        public static void ExcelExport<T>(List<T> data, string exportFileName, List<string> columnNames)
        {
            StringWriter sw = GetStringWriter(data,columnNames);
            HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
            string fileName = exportFileName;
            //判断浏览器如果是IE则对文件名进行URL编码处理
            string ua = HttpContext.Current.Request.UserAgent;
            if (!string.IsNullOrEmpty(ua))
            {
                if (ua.ToLower().IndexOf("msie", System.StringComparison.Ordinal)>=0)
                {
                    fileName = HttpUtility.UrlEncode(exportFileName, Encoding.UTF8);
                }
            }

            string str = "attachment;filename= " + fileName + ".xls ";
            HttpContext.Current.Response.AppendHeader("Content-Disposition", str);
            HttpContext.Current.Response.ContentType = "application/ms-excel";
            HttpContext.Current.Response.Write(sw);
            HttpContext.Current.Response.End();
        }

        /// <summary>
        /// 数据字串拼接
        /// </summary>
        /// <typeparam name="T">集合类型</typeparam>
        /// <param name="data">数据集合</param>
        /// <param name="columnNames">要显示的列名(类字段名)</param>
        /// <returns></returns>
        public static StringWriter GetStringWriter<T>(List<T> data,List<string> columnNames )
        {
            StringWriter sw = new StringWriter();

            var type = typeof(T);
            var properties = type.GetProperties();
            if (columnNames!=null&&columnNames.Count > 0)
            {
               // properties = properties.Where(t => columnNames.Contains(t.Name)).ToArray();
                //为了与指定字段顺序一致,才如此循环
                PropertyInfo[] property=new PropertyInfo[columnNames.Count];
                for (int i = 0; i < columnNames.Count; i++)
                {
                    property[i] = properties.FirstOrDefault(t => t.Name == columnNames[i]);
                }
                properties = property;
            }
            sw.Write(sw.NewLine);
            if (data != null)
            {
                //添加列名:
                var colName = "";
                foreach (var property in properties)
                {
                    colName = property.Name;
                    if (property.CustomAttributes.LongCount() >0)
                    {
                       colName = property.CustomAttributes.First().ConstructorArguments.First().Value.ToString();
                    }
                    sw.Write(colName + "\t");
                }
                sw.Write(sw.NewLine);

                foreach (var row in data)
                {
                    foreach (var property in properties)
                        sw.Write(property.GetValue(row, null) + "\t");

                    sw.Write(sw.NewLine);
                }
            }
            sw.Close();
            return sw;
        }

    }

必要的注释代码中都有了,这里就不过多叙述了,从上面代码中我们可以看到这个方法转换出来的并不是真的Excel文件,只是采用字符串换行分割的方式来让Excel程序识别成表格的格式。

缺点是:不能设置复杂的样式,每次下载后打开文件可能都会提示“不是有效的Excel文件,是否继续打开?”之类的提示,你只要点是就可以了。当然打开文件后你另存为标准的Excel文件就成为真正的Excel文件了,所以这点可以接受的。

优点是:这种导出方式只是通过拼接字符串来合成的内容,所以执行效率上相对导出到标准的Excel文件的效率要提高很多,而且没有设置格式功能也没有大的影响,因为每个业务人员都想按照自己的想法去编辑表格的样式。

调用方式:

      protected void CreateExecl(int classId)
        {
            StudentManager marager = new StudentManager();
            List<StudentModel> list = marager.StudentList(classId);
            string fileName = "XX班学生数据";
            var listfiled = new List<string>
            {
                "Id",
                "Name",
                "Birthday"
            };
            DataExportHelper.ExcelExport(list, fileName, listfiled);
        }

数据导出后表格列显示的顺序由listfiled集合中值的顺序来决定的,集合中的值都是传入的数据集合StudentModel类中的字段。导出数据支持泛型,请注意,要显示的字段集合必须是传入数据类型中有的字段。

接下来我们看下如果我们想让导出的表格每列的标题显示出对应的中文描述应该如何做?下面是StudentModel的定义。

public class StudentModel
    {
        [Description("学号")]
        public DateTime Id { get; set; }

        [Description("姓名")]
        public double Name { get; set; }

         [Description("生日")]
        public double Birthday { get; set; }
    }

从上面代码中可以看出导出的中文标题是根据字段的Description属性来获取的。

以上就是简单的数据导出方法。如有此文有错误的地方,或者大侠们有更好的解决方法,欢迎指正和指导~

注:如有转载或引用请注明出处 http://www.cnblogs.com/sev7en/p/4021994.html ~

时间: 2024-10-11 21:11:08

.net中数据集合导出为Excel(支持泛型及显示字段顺序,可自定义显示列名)的相关文章

.Net中DataGridview数据如何导出到excel表

首先,这个问题在网上有很多答案,也有很多解决的方法.其次,很多人写过类似的博客 .我的这篇博客,主要是写给那些刚刚接触或接触不久.NET并使用其做程序的人,更是写个自己,记录一下方法,方便以后使用. 在窗体中添加一个DataGridView控件,DatagridView获得数据: DataGridView1.DataSource = crList(泛型)或DataGridView1.DataSource=DataSet.Table(0).{注意:通过查询数据库,将查询到的数据放入crList或D

可以导入导出到Excel支持多表头多层显示的表格控件Essential Grid

Essential Grid for Windows Forms是一款功能强大的表格控件,很多功能和Excel表格相似,具有15种单元格类型,可以导入导出到Excel,支持多表头,多层显示,合并单元格,插入计算公式,支持LINQ,过滤和分组等. 具体功能: 支持Banner Cells,可以联合背景和邻近的单元格来显示一个背景图像或图片 支持完全自定义单元格样式 支持多个单元格覆盖合并 可以冻结行和列 表格控件支持MS Office 2003, MS Office 2007 和 Vista 样式

将GridView数据直接导出为EXCEL(保留样式),适用GV不分页的情况

Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"); Response.Charset = ""; Response.ContentType = "application/vnd.ms-excel"; EnableViewState = false; System.IO.StringWriter tw = new System.IO.StringWriter()

使用pentaho工具将数据库数据导入导出为Excel

写在前面:本篇博客讲述的是如何使用pentaho工具快速的将数据库数据导出为Excel文件,以及如何将Excel文件数据导入数据库. 补充:使用此工具并不需要任何一句代码并能快速便捷解决实际问题,此工具功能不仅仅局限这一点,其他功能后续更新. 工具下载:你可以根据你电脑的系统选择不同版本在pentaho官网进行下载: http://www.pentaho.com/download 需求一:将mysql一张表数据导出到Excel 第一步:添加数据库驱动包 注意:由于本例我要将mysql数据库数据导

salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)

我们都知道,报表有个功能为导出excel,但是有的时候客户需求往往标准的报表达不到,比如导出excel,其中本月修改的数据字段标红,如下图所示. 这就需要我们去写VF来实现此功能. 需求:将数据表记录导出成excel,其中excel内容需要本月修改的数据字段自动标红显示. 表:Goods__c,字段如下: 设计思路:如果导出excel并且需要跟踪每个字段的修改时间进行校验是否标红,则需要有一个表取跟踪这个表.有两种方式进行Track. 1.salesforce中提供了Track History功

C#开发---利用特性自定义数据通用导出到Excel

网上C#导出Excel的方法有很多.但用来用去感觉不够自动化.于是花了点时间,利用特性做了个比较通用的导出方法.只需要根据实体类,自动导出想要的数据  1.在NuGet上安装Aspose.Cells或者用微软自带类库也可以  2.需要导出的数据的实例类: using System.ComponentModel; using System.Reflection; using System.Runtime.Serialization; public class OrderReport { [Disp

2.11 Hive中数据导入导出Import和Export使用

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ImportExport 一.Export.Import Export 导出,将Hive表中的数据,导出到外部 Import 导入,将外部数据导入Hive表中 二.Export 1.语法 EXPORT TABLE tablename TO 'export_target_path'; 2.用法 #把emp表导出到hdfs上 hive (default)> EXPORT T

用C# ASP.net将数据库中的数据表导出到Excel中

需要用到组件GridView和一个button即可. 给GridView添加一个数据源, 选择你想要的数据库中的表的字段,添加成功后GridView中就显示数据. 再添加一个button,双击控件添加相对应的功能代码 功能代码如下: protected void Button1_Click(object sender, EventArgs e) { string FileName = "得分表 " + DateTime.Now + ".xls"; Response.

对Jmeter响应数据中指定内容导出到excel

这几天接到一个任务,验证某个接口优化后,比之前功能有了大幅度的提高,需要对此接口跑批量的原来跑过的数据,把结果和之前的最比对,这就涉及到要把response中指定的一部分内容取出,再与原来的做比对.Jmeter调接口跑批量的数据很容易做到,关键是怎么把每次请求response中你感兴趣的内容提取并导出来. 搜到一片博文作参考,尝试一下,如果照此方法成功完成任务再来详述.引用参考的link https://www.jianshu.com/p/2041ba5ee2e0 原文地址:https://ww