网上C#导出Excel的方法有很多。但用来用去感觉不够自动化。于是花了点时间,利用特性做了个比较通用的导出方法。只需要根据实体类,自动导出想要的数据 1.在NuGet上安装Aspose.Cells或者用微软自带类库也可以 2.需要导出的数据的实例类: usingSystem.ComponentModel;usingSystem.Reflection;usingSystem.Runtime.Serialization;publicclassOrderReport{[DisplayName(订单编号)]publicstringorderNo{get;set;}[IgnoreDataMember]publicDateTimeorderTime{get;set;}[DisplayName(订单时间)]publicStringorderTime_fomart{get{returnorderTime.ToShortDateString();}}[DisplayName(商品编码)]publicstringitemCode{get;set;}[DisplayName(商品名称)]publicstringitemName{get;set;}} 定义实体中加上[DisplayName(订单编号)]用来导出到Excel生成列名。不需在导出一一对应写列名。[IgnoreDataMember]属性是用来导出是忽略掉不用导出 关于特性的介绍详细请参考MSDN。 3.实现导出方法: ///summary///导出类////summarypublicclassExportHandle{///summary///挂起订单报表导出////summarypublicstaticvoidexecExportOrderReport(){varorderReportList=newListOrderReport(){newOrderReport(){orderNo=XD,orderTime=DateTime.Now,itemCode=G,itemName=辣条},newOrderReport(){orderNo=XD,orderTime=DateTime.Now,itemCode=G,itemName=茶蛋},newOrderReport(){orderNo=XD,orderTime=DateTime.Now,itemCode=G,itemName=切糕},newOrderReport(){orderNo=XD,orderTime=DateTime.Now,itemCode=G,itemName=大虾},newOrderReport(){orderNo=XD,orderTime=DateTime.Now,itemCode=G,itemName=帝王蟹}};stringpath=OrderReport.xlsx;Console.WriteLine(开始执行导出);OutDataToExcel(orderReportList,订单报表,path);Console.WriteLine(导出完成:位置+path);}///summary///导出方法////summary///typeparamname=T/typeparam///paramname=list导出的数据list/param///paramname=title数据类容标题/param///paramname=path导出excel存放路径/parampublicstaticvoidOutDataToExcelT(ListTlist,stringtitle,stringpath){Workbookworkbook=newWorkbook();//工作簿Worksheetsheet=workbook.Worksheets[0];//工作表sheet.IsGridlinesVisible=false;//去掉初始单元线Cellscells=sheet.Cells;//单元格//为标题设置样式StylestyleTitle=workbook.CreateStyle();//新增样式styleTitle.HorizontalAlignment=TextAlignmentType.Center;//文字居中styleTitle.Font.Name=微软雅黑;//文字字体styleTitle.Font.Size=18;//文字大小styleTitle.Font.IsBold=true;//粗体//样式1标题下方的日期Stylestyle1=workbook.CreateStyle();//新增样式style1.HorizontalAlignment=TextAlignmentType.Center;//文字居中style1.Font.Name=微软雅黑;//文字字体style1.Font.Size=12;//文字大小//样式2列名Stylestyle2=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数据的样式Stylestyle3=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;vart=list.First().GetType();//获取列表的类的属性//通过反射筛选忽略掉[IgnoreDataMemberAttribute]的字段varproperties=t.GetProperties().Where(x=x.GetCustomAttributeIgnoreDataMemberAttribute()==null);intColnum=properties.Count();//表格列数intRownum=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);//行高//列名及数据行inti=0;foreach(variteminproperties){varitemType=t.GetProperty(item.Name);varcolName=itemType.GetCustomAttributeDisplayNameAttribute().DisplayName;//反射获取字段的DisplayName特性值cells[2,i].PutValue(colName);cells[2,i].SetStyle(style2);cells.SetColumnWidth(i,colName.Length*3);//设置列宽intk=0;foreach(varrowdatainlist){//反射遍历添加数据objectvalue=rowdata.GetType().GetProperty(item.Name).GetValue(rowdata,null);stringss=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}} 导出方法OutDataToExcelT(ListTlist,Enumen,stringpath)用了泛型参数,将任意的实体list自动导出。 varproperties=t.GetProperties().Where(x=AttributeAccessor.GetAttributeIgnoreDataMemberAttribute(x)==null);采用lamda表达式在传过来的实体属性中筛选出 不是IgnoreDataMemberAttribute的属性字段 foreach(variteminproperties){}遍历实体的属性相当于DataTable循环读取数据 objectvalue=rowdata.GetType().GetProperty(item.Name).GetValue(rowdata,null);通过属性名称获取属性值。 通过以上两个步骤,实现自动 } 4.导出结果: 总结,通过特性来实现通用的导出。只需要设置相关的类的字段和特性值即可自定义导出 白癜风医院白癜风医院转载请注明原文网址:http://www.helimiaopu.com/cxkf/cxkf/1199.html |