网上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; }
}
定义实体中加上 [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[]; //工作表
sheet.IsGridlinesVisible = false;//去掉初始单元线
Cells cells = sheet.Cells;//单元格
//为标题设置样式
Style styleTitle = workbook.CreateStyle();//新增样式
styleTitle.HorizontalAlignment = TextAlignmentType.Center;//文字居中
styleTitle.Font.Name = "微软雅黑";//文字字体
styleTitle.Font.Size = ;//文字大小
styleTitle.Font.IsBold = true;//粗体
//样式1 标题下方的日期
Style style1 = workbook.CreateStyle();//新增样式
style1.HorizontalAlignment = TextAlignmentType.Center;//文字居中
style1.Font.Name = "微软雅黑";//文字字体
style1.Font.Size = ;//文字大小
//样式2 列名
Style style2 = workbook.CreateStyle();//新增样式
style2.HorizontalAlignment = TextAlignmentType.Center;//文字居中
style2.Font.Name = "微软雅黑";//文字字体
style2.Font.Size = ;//文字大小
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 = ;//文字大小
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 == ) 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(, , , Colnum);//合并单元格
cells[, ].PutValue(title);//填写内容
cells[, ].SetStyle(styleTitle);
cells.SetRowHeight(, );//行高
//生成行2 日期
cells.Merge(, , , Colnum);//合并单元格
cells[, ].PutValue(DateTime.Now.ToShortDateString());//填写内容
cells[, ].SetStyle(style1);
cells.SetRowHeight(, );//行高
//列名及数据行
int i = ;
foreach (var item in properties)
{
var colName = GetAttribute<DisplayNameAttribute>(item)?.DisplayName;//反射获取字段的DisplayName特性值
cells[, i].PutValue(colName);
cells[, i].SetStyle(style2);
cells.SetColumnWidth(i, colName.Length * );//设置列宽
int k = ;
foreach (var rowdata in list)
{
//反射遍历添加数据
object value = item.GetValue(rowdata, null);
string ss = value == null ? "" : value.ToString();
cells[ + k, i].PutValue(ss);
cells[ + k, i].SetStyle(style3);
cells.SetRowHeight( + k, );//设置行高
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; }
}
导出方法 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.导出结果:

总结,通过特性来实现通用的导出。只需要设置相关的类的字段和特性值即可自定义导出

C#导出Excel-利用特性自定义数据的更多相关文章

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

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

  2. java POI导出Excel文件数据库的数据

    在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...

  3. ASP.NET导出Excel(利用NPOI和EPPlus库,无需安装Office)

    网上提供了很多Asp.net中操作Excel的方法,其中大部分是调用微软的Office组件,下面提供三个无须安装Office即可从Asp.net输出Excel的方法. 1 简单方法 //下面代码输出的 ...

  4. js导出excel:前端当前数据的导出

    网上找的库文件,同样做了修改.在导出的时候,有时候数据第一列和最后一列可能是复选框和操作按钮,这个是我们不需要的,加了这个的过滤 //table2excel.js /* * jQuery table2 ...

  5. Asp.net导出Excel/Csv文本格式数据

    刚刚开始做Excel相关的项目,所以遇到的问题不管大小都给记录一下 偶然的机会在添加数据的时候全改成了数字,结果输出的时候全自动变成了科学计数法,这是excel的强大功能,能自动识别数字和字符串,太聪 ...

  6. JAVA 利用反射自定义数据层框架

    之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...

  7. 导出excel(利用工具类导出excel)

    /** * 添加导出功能 * @param creditPageResult * @param request * @param response */ @RequestMapping(value = ...

  8. java操作Excel之POI(4)利用POI实现数据的批量导出

    后台导出方法: /** * 后台导出方法 * 利用POI实现数据的批量导出 */ public String export() throws Exception{ Connection con = n ...

  9. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

随机推荐

  1. java数组复制===clone()

    总结:使用方法原理弄清楚 package com.a; public class gjsopb { public static void main(String[] args) { int a[] = ...

  2. node.js的了解

    在node环境上面运行js代码,js相当于php,node相当于apache环境 第一步装 node 环境1.从官网下载 dmg 文件安装 2.通过命令行安装 需要用到 homebrew(mac上专门 ...

  3. oracle数据库中函数的递归调用

    如有下面的表结构AAAA,用一个字段prev_id表示记录的先后顺序,要对其排序,需要用的递归函数 ID PREV_ID CONT 99   a 23 54 d 21 23 e 54 33 c 33 ...

  4. Git第三方仓库安装方式(IUS)

    1.安装使用里面说的自动化安装脚本 curl https://setup.ius.io | sh 2.然后可以看到 git2u相关内容 yum search git 3.执行安装,并查看下版本 yum ...

  5. ubuntu 16.04更新软件源

    1.打开 system settings 2.打开 system栏目里的 software and updates 3.打开 ubuntu software 栏目里的 download from 4. ...

  6. CImage得到位图的大小

    CImage image; image.Load(_T("1.jpg")); //HBITMAP hBitmap=image.Detach(); HGLOBAL m_hMem = ...

  7. linux下静态库和动态库一些东西

    http://www.cnblogs.com/changefuture/archive/2011/12/22/2297460.html Linux  动态链接库和静态库示例 文件预览 文件目录树如下, ...

  8. python的ftplib模块

    Python中的ftplib模块 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件 FTP的工作流程及基本操作可参考协议RFC95 ...

  9. 【289】◀▶ Python I/O & 读写文本文件

    参考:Python 文件 I/O 参考:Python OS 文件/目录方法 目录: 01   open 函数 用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写. 02   F ...

  10. linux的基本指令--第三节

    查找与检索: 一.文件名查找:find . -name "test*"      find 路径  查找类型  名字  未输入路径则默认当前路径 二 . 内容检索:grep  &q ...