给Execl样式添加配置文件.
本文共 5613 字,大约阅读时间需要 18 分钟。
记一个小东东.相信大家都做过不少这样的,把数据导入到execl上去.这个很容易.但是不久后就是用户老是要修改execl上的样式.比如给某个栏位加上颜色.
虽然说很容易.但是每修改次都要重新发布.不是很爽.下面说一个比较另类的方法.效果相当于给Execl的样式加上配置文件.
第一步.把数据集给导出成HTML格式.如下.主要是方法EnumToHtml,别的大家不用看.
代码 public static class ExportHelper < T > { public static readonly List < PropertyInfo > ps = null ; static ExportHelper() { if (ps == null ) { ps = typeof (T).GetProperties().ToList(); } } public static string EnumToHtml(IEnumerable < T > data, string subject) { return EnumToHtml(data, subject, null ); } public static string EnumToHtml(IEnumerable < T > data, string subject, string linkcss) { if (data == null ) return string .Empty; StringBuilder sb = new StringBuilder(); if ( ! string .IsNullOrEmpty(linkcss)) { sb.Append( " <head> " ); sb.Append( " <link rel='stylesheet' type='text/css' href= " ); sb.Append(linkcss).Append( " /> " ); sb.Append( " </head> " ); sb.Append( " <body> " ); sb.Append( " <table> " ); sb.Append( " <caption> " ).Append(subject).Append( " </caption> " ); sb.Append( " <tr class='column'> " ); } else { sb.Append( " <body> " ); sb.Append( " <table style='border-color: #000000; width:80%; table-layout: auto; border-collapse: collapse;' " ); sb.Append( " border='1' cellpadding='2' cellspacing='2'> " ); sb.Append( " <caption style='color: #000000; font-weight: bold; font-size: large' > " ); sb.Append(subject); sb.Append( " </caption> " ); sb.Append( " <tr> " ); } foreach (PropertyInfo info in ps) { sb.Append( " <th id= " ).Append(info.Name).Append( " > " ); sb.Append(info.Name); sb.Append( " </th> " ); } sb.Append( " </tr> " ); foreach (T t in data) { sb.Append( " <tr> " ); foreach (PropertyInfo info in ps) { sb.Append( " <td> " ); sb.Append(info.GetValue(t, null )); sb.Append( " </td> " ); } sb.Append( " </tr> " ); } sb.Append( " </table> " ); sb.Append( " </body> " ); return sb.ToString(); } public static void EnumToExel(Worksheet wsheet, IEnumerable < T > data, string toptext) { EnumToExel(wsheet, data, toptext, 1 , 1 ); } public static void EnumToExel(Worksheet wsheet, IEnumerable < T > data, string toptext, int top, int left) { if (data == null ) return ; int nTop = top; int nLeft = left; foreach (PropertyInfo info in ps) { wsheet.Cells[nTop, nLeft] = info.Name; nLeft ++ ; } foreach (T t in data) { nTop ++ ; nLeft = left; foreach (PropertyInfo info in ps) { wsheet.Cells[nTop, nLeft] = info.GetValue(t, null ); nLeft ++ ; } } wsheet.get_Range(wsheet.Cells[top, left], wsheet.Cells[nTop, nLeft - 1 ]).Borders.LineStyle = 1 ; } public static void Write(T s) { foreach (PropertyInfo minfo in ps) { if (minfo.GetValue(s, null ) != null ) { string value = minfo.GetValue(s, null ).ToString(); Console.ForegroundColor = ConsoleColor.Yellow; Console.Write(minfo.Name); Console.ForegroundColor = ConsoleColor.White; Console.Write( " : " ); Console.ForegroundColor = ConsoleColor.Green; Console.Write(value); Console.Write( " " ); } } Console.WriteLine(); } } 然后.用如下方法导出数据到execl.
代码 var bomresult = db.A51_BomSendMail(bom.ModelNo).ToList < A51_BomSendMailResult > (); // 把数据转化成相应的HTML格式的数据表 body = ExportHelper < A51_BomSendMailResult > .EnumToHtml(bomresult, bom.ModelNo, @" D:\style.css " ); // 得到上面数据的字节转换 byte [] buffer = Encoding.ASCII.GetBytes(body); // 生成对应的字节流 Stream stream = new MemoryStream(buffer); FileStream filestream = new FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite); filestream.Write(buffer, 0 , buffer.Length); filestream.Close(); 上面的我一部分实现.大家可按自己需求来改.
到这里大家也知道了.其实就是利用CSS来做配置文件.希望大家不要鄙视.^_^
比如开始生成的文件如下.
后面用户要把栏位名加Replaced_by变成红色.整个页面要带点墨色.要好看.
用户就是上帝.没办法.用上面的代码.在如下位置D:\style.css写上CSS;
CSS table { margin : 1em auto ; font : 95%/130% Tahoma, Arial, Helvetica, sans-serif ; border-spacing : 0 ; border-color : #000000 ; width : 80% ; table-layout : auto ; border-collapse : collapse ; } table caption { color : #2442b1 ; font-size : 200% ; letter-spacing : .1em ; padding : 3.5em 0.2em 2em 0 ; text-align : left ; font-weight : 900 ; } table td { color : #203276 ; border-top : 1px solid #fff ; border-right : 1px solid #c6cdd8 ; border-bottom : 1px solid #c6cdd8 ; border-left : 1px solid #fff ; padding : 1.5em 0.5em 1.5em 0.8em ; text-align : left ; } tr.column th { background-color : #BBAABB ; } #Replaced_by { background-color : #FF3399 ; }
然后效果图如下:
总的来就这么多.但是有的同志喜欢把直接用DataTable.下面也做了一个差不多的.代码简单.给个思路.自己去改.
代码 public static string EnumToHtml(System.Data.DataTable data, string subject, string linkcss) { if (data == null) return string.Empty; StringBuilder sb = new StringBuilder(); int columnCount = 0; if (!string.IsNullOrEmpty(linkcss)) { sb.Append("<head>"); sb.Append("<link rel='stylesheet' type='text/css' href="); sb.Append(linkcss).Append(" />"); sb.Append("</head>"); sb.Append("<body>"); sb.Append("<table>"); sb.Append("<caption>").Append(subject).Append("</caption>"); sb.Append("<tr class='column'>"); } else { sb.Append("<body>"); sb.Append("<table style='border-color : #000000 ; width : 80% ; table-layout : auto ; border-collapse : collapse ; ' "); sb.Append("border='1' cellpadding='2' cellspacing='2'>"); sb.Append("<caption style='color : #000000 ; font-weight : bold ; font-size : large' >") ; sb.Append(subject); sb.Append("</caption>"); sb.Append("<tr>"); } foreach (DataColumn info in data.Columns) { sb.Append("<th id=").Append(info.ColumnName).Append(">"); sb.Append(info.ColumnName); sb.Append("</th>"); columnCount++; } sb.Append("</tr>"); foreach (DataRow row in data.Rows) { sb.Append("<tr>"); for (int i = 0; i < columnCount; i++) { sb.Append("<td>"); sb.Append(row[i]); sb.Append("</td>"); } sb.Append("</tr>"); } sb.Append("</table>"); return sb.ToString(); }
差不多就这么样了.先放着看看.以后他们要改什么样式,直接去CSS里改,不用重新发布.
转载地址:http://vgrbz.baihongyu.com/