C#导出Excel-利用特性自定义数据
网上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; }
}
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; }
}
foreach (var item in properties){}遍历实体类的属性相当于DataTable循环读取数据
object value = rowdata.GetType().GetProperty(item.Name).GetValue(rowdata, null); 通过属性名称获取属性值。
通过以上两个步骤,实现自动
}
4.导出结果:

总结,通过特性来实现通用的导出。只需要设置相关的类的字段和特性值即可自定义导出
C#导出Excel-利用特性自定义数据的更多相关文章
- C#开发---利用特性自定义数据导出到Excel
网上C#导出Excel的方法有很多.但用来用去感觉不够自动化.于是花了点时间,利用特性做了个比较通用的导出方法.只需要根据实体类,自动导出想要的数据 1.在NuGet上安装Aspose.Cells或 ...
- java POI导出Excel文件数据库的数据
在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.这里我简单实现导出Excel文件. POI jar ...
- ASP.NET导出Excel(利用NPOI和EPPlus库,无需安装Office)
网上提供了很多Asp.net中操作Excel的方法,其中大部分是调用微软的Office组件,下面提供三个无须安装Office即可从Asp.net输出Excel的方法. 1 简单方法 //下面代码输出的 ...
- js导出excel:前端当前数据的导出
网上找的库文件,同样做了修改.在导出的时候,有时候数据第一列和最后一列可能是复选框和操作按钮,这个是我们不需要的,加了这个的过滤 //table2excel.js /* * jQuery table2 ...
- Asp.net导出Excel/Csv文本格式数据
刚刚开始做Excel相关的项目,所以遇到的问题不管大小都给记录一下 偶然的机会在添加数据的时候全改成了数字,结果输出的时候全自动变成了科学计数法,这是excel的强大功能,能自动识别数字和字符串,太聪 ...
- JAVA 利用反射自定义数据层框架
之前的随笔一直都在介绍c#,主要公司最近的业务都是做桌面程序,那么目前c#中的WPF肯定是我做桌面程序的不二之选,做了半年的WPF,也基本摸清了c#写代码的套路和规则(本人之前是两年多的JAVA开发者 ...
- 导出excel(利用工具类导出excel)
/** * 添加导出功能 * @param creditPageResult * @param request * @param response */ @RequestMapping(value = ...
- java操作Excel之POI(4)利用POI实现数据的批量导出
后台导出方法: /** * 后台导出方法 * 利用POI实现数据的批量导出 */ public String export() throws Exception{ Connection con = n ...
- 使用POI导出EXCEL工具类并解决导出数据量大的问题
POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...
随机推荐
- 【转】使用JMeter 完成常用的压力测试(二)
使用JMeter 完成常用的压力测试 Login.jsp 和welcome.jsp.其中 login.jsp 负责生成 User 对象,并调用 User 的login.当 login 返回为 true ...
- HDU 5705 Clock(模拟,分类讨论)
Clock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submi ...
- Tarjan模版(链式向前星表示方法)
这道模版用到了链式向前星表示法: struct node { int v,next; }edge[]; void add(int x,int y) { edge[++cnt].next=heads[x ...
- 1060 Are They Equal
题意: 给出两个浮点数(最大不超过10^100),以及存储的有效位数,判断这两个数是否相等.如12300和12358.9若存储的有效位数为3,则均表示为0.123*10^5,因此视为相等. 思路:[字 ...
- Python多线程-守护线程
守护线程:守护着非守护线程,守护线程和非守护线程同时运行,当非守护线程运行结束后,无论守护线程有没有运行完,脚本都会停止运行 首先看一段普通的多线程实例 # -*- coding:utf-8 -*- ...
- app端内容播放,web端的玩具,app通过websocket远程遥控玩具播放内容,玩具管理页面
一.app端内容播放 下载代码 https://github.com/987334176/Intelligent_toy/archive/v1.0.zip 注意:由于涉及到版权问题,此附件没有图片和音 ...
- HDFS的介绍
设计思想 分而治之:将大文件.大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析: 在大数据系统中作用:为各类分布式运算框架(如:mapreduce,spark,te ...
- leetcode896
class Solution { public: bool isMonotonic(vector<int>& A) { ) { return true; } bool GetDif ...
- Swagger SpringBoot 集成
说明:Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参数和模型紧密集 ...
- Asp.NetCore远程自启动、重启、关闭实现
一.背景 NetCore作为微服务可以注册到服务中心,服务中心可以远程启动.重启.关闭该微服务 二.实现 1.创建一个NetCore 2.0 WebApi项目 2.创建一个进程去管理NetCore程序 ...