IT知识库 购物 网址 游戏 小说 歌词 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> C# -> C#开发 -> 正文阅读

[C#]C#开发

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


 using System.ComponentModel;
    using System.Reflection;
    using System.Runtime.Serialization;
    public class OrderReport
    {
        [DisplayName("订单编号")]
        public string orderNo { get; set; }

        [IgnoreDataMember]
        public DateTime orderTime { get; set; }
        [DisplayName("订单时间")]
        public String orderTime_fomart { get { return orderTime.ToShortDateString(); } }

        [DisplayName("商品编码")]
        public string itemCode { get; set; }

        [DisplayName("商品名称")]
        public string itemName { get; set; }
    }

View Code
定义实体中加上 [DisplayName("订单编号")]用来导出到Excel生成列名。不需在导出一一对应写列名。[IgnoreDataMember]属性是用来导出是忽略掉不用导出 。
关于特性的介绍详细请参考MSDN。
3.实现导出方法:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using Aspose.Cells;

/// <summary>
/// 导出类
/// </summary>
public class ExcelHerper
{
    /// <summary>
    /// 获取定义的特性值
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="provider"></param>
    /// <returns></returns>
    public static T GetAttribute<T>(ICustomAttributeProvider provider)
    where T : Attribute
    {
        return provider.GetCustomAttributes(typeof(T), true)
            .Cast<T>().ToArray().FirstOrDefault();
    }

    /// <summary>
    ///订单报表导出
    /// </summary>
    public static void ExecExportOrderReport()
    {
        var orderReportList = new List<OrderReport>()
            {
               new OrderReport() { orderNo= "XD00001",orderTime=DateTime.Now, itemCode="G001" ,itemName="辣条"} ,
               new OrderReport() { orderNo= "XD00002", orderTime=DateTime.Now,itemCode="G002" ,itemName="茶蛋"} ,
               new OrderReport() { orderNo= "XD00003", orderTime=DateTime.Now,itemCode="G003" ,itemName="切糕"} ,
               new OrderReport() { orderNo= "XD00004", orderTime=DateTime.Now,itemCode="G004" ,itemName="大虾"} ,
               new OrderReport() { orderNo= "XD00005", orderTime=DateTime.Now,itemCode="G005" ,itemName="帝王蟹"}
            };
        string path = "OrderReport.xlsx";
        Console.WriteLine("开始执行导出");
        OutDataToExcel(orderReportList, path);
        Console.WriteLine("导出完成:位置" + path);
    }

    /// <summary>
    /// 导出方法
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list">导出的数据list</param>
    /// <param name="title">数据类容标题</param>
    /// <param name="path">导出excel存放路径</param>
    public static void OutDataToExcel<T>(List<T> list,string path)
    {
        Workbook workbook = new Workbook(); //工作簿 
        Worksheet sheet = workbook.Worksheets[0]; //工作表 
        sheet.IsGridlinesVisible = false;//去掉初始单元线
        Cells cells = sheet.Cells;//单元格 
                                  //为标题设置样式     
        Style styleTitle = workbook.CreateStyle();//新增样式 
        styleTitle.HorizontalAlignment = TextAlignmentType.Center;//文字居中 
        styleTitle.Font.Name = "微软雅黑";//文字字体 
        styleTitle.Font.Size = 18;//文字大小 
        styleTitle.Font.IsBold = true;//粗体 
                                      //样式1 标题下方的日期
        Style style1 = workbook.CreateStyle();//新增样式 
        style1.HorizontalAlignment = TextAlignmentType.Center;//文字居中 
        style1.Font.Name = "微软雅黑";//文字字体 
        style1.Font.Size = 12;//文字大小 
                              //样式2 列名
        Style style2 = workbook.CreateStyle();//新增样式 
        style2.HorizontalAlignment = TextAlignmentType.Center;//文字居中 
        style2.Font.Name = "微软雅黑";//文字字体 
        style2.Font.Size = 12;//文字大小 
        style2.Font.IsBold = true;//粗体 
        style2.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
        style2.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
        style2.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
        style2.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;
        //样式3 数据的样式
        Style style3 = workbook.CreateStyle();//新增样式 
        style3.HorizontalAlignment = TextAlignmentType.Center;//文字居中 
        style3.Font.Name = "微软雅黑";//文字字体 
        style3.Font.Size = 10;//文字大小 
        style3.Borders[BorderType.LeftBorder].LineStyle = CellBorderType.Thin;
        style3.Borders[BorderType.RightBorder].LineStyle = CellBorderType.Thin;
        style3.Borders[BorderType.TopBorder].LineStyle = CellBorderType.Thin;
        style3.Borders[BorderType.BottomBorder].LineStyle = CellBorderType.Thin;

        if (list.Count == 0) return;

        var t = list.First().GetType();//获取列表的类的属性
        var properties = t.GetProperties().Where(x => GetAttribute<IgnoreDataMemberAttribute>(x) == null);//筛选出需要导出的字段
        var title = GetAttribute<DisplayNameAttribute>(t)?.DisplayName;
        int Colnum = properties.Count();//表格列数 
        int Rownum = list.Count;//表格行数 

        //生成行1 标题行    
        cells.Merge(0, 0, 1, Colnum);//合并单元格 
        cells[0, 0].PutValue(title);//填写内容 
        cells[0, 0].SetStyle(styleTitle);
        cells.SetRowHeight(0, 38);//行高
                                  //生成行2 日期    
        cells.Merge(1, 0, 1, Colnum);//合并单元格 
        cells[1, 0].PutValue(DateTime.Now.ToShortDateString());//填写内容 
        cells[1, 0].SetStyle(style1);
        cells.SetRowHeight(1, 20);//行高
                                  //列名及数据行
        int i = 0;
        foreach (var item in properties)
        {
            var colName = GetAttribute<DisplayNameAttribute>(item)?.DisplayName;//反射获取字段的DisplayName特性值
            cells[2, i].PutValue(colName);
            cells[2, i].SetStyle(style2);
            cells.SetColumnWidth(i, colName.Length * 3);//设置列宽
            int k = 0;
            foreach (var rowdata in list)
            {
                //反射遍历添加数据
                object value = item.GetValue(rowdata, null);
                string ss = value == null ? "" : value.ToString();
                cells[3 + k, i].PutValue(ss);
                cells[3 + k, i].SetStyle(style3);
                cells.SetRowHeight(3 + k, 18);//设置行高
                k++;
            }
            i++;
        }
        workbook.Save(path);//生成Excel
    }
}


[DisplayName("订单报表")]
public class OrderReport
{
    [DisplayName("订单编号")]
    public string orderNo { get; set; }

    [IgnoreDataMember]
    public DateTime orderTime { get; set; }
    [DisplayName("订单时间")]
    public string orderTime_fomart { get { return orderTime.ToShortDateString(); } }

    [DisplayName("商品编码")]
    public string itemCode { get; set; }

    [DisplayName("商品名称")]
    public string itemName { get; set; }
}

View Code
导出方法 OutDataToExcel<T>(List<T> list, Enum en, string path)用了泛型参数,将任意的实体list自动导出。 
var properties = t.GetProperties().Where(x => AttributeAccessor.GetAttribute<IgnoreDataMemberAttribute>(x) == null);采用lamda表达式在传过来的实体属性中筛选出
不是IgnoreDataMemberAttribute的属性字段
foreach (var item in properties){}遍历实体类的属性相当于DataTable循环读取数据 
object value = rowdata.GetType().GetProperty(item.Name).GetValue(rowdata, null); 通过属性名称获取属性值。
通过以上两个步骤,实现自动
}
4.导出结果:

总结,通过特性来实现通用的导出。只需要设置相关的类的字段和特性值即可自定义导出
上一篇文章      下一篇文章      查看所有文章
加:2016-07-17 00:22:49  更:2017-05-14 19:17:35 
 
  C# 最新文章
字符串阵列分别输出元素的索引,原值和长度
格式化你的字符串
C#宣告一个变量
C#中级
拆分一个字符串并把每个字符单独输出
通过手机号定位归属地
【重构学习】02 何处重构?
C#把数组中的某个元素取出来放到第一个位置
c#加密 可逆与不可逆MD5 加密
实现一个双缓冲队列(二)
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 三丰软件 开发 中国文化 网文精选 阅读网 看图 日历 万年历 2018年8日历
2018-8-15 3:16:47
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库