C#中DataGridView中数据导出为网页的问题
在对服务器进行巡检后,我们需要保存一份巡检的日志下来,虽然可以通过sprie.xls第三方控件保存为excel,但是感觉还是直接生成网页更加方便。这里使用到了VUE2+elementUI的单页面。
1、生成网页的问题
对于生成网页的问题,网上看到一个例子,是直接在代码中拼页面,感觉太累还不好修改,如下
/// <summary> /// 把DataTable转换成网页格式 /// </summary> /// <param name="dt"></param> /// <returns></returns> public string ExportDatatableToHtml(DataTable dt) { StringBuilder strHTMLBuilder = new StringBuilder(); strHTMLBuilder.Append("<html >"); strHTMLBuilder.Append("<head>"); strHTMLBuilder.Append("</head>"); strHTMLBuilder.Append("<body>"); strHTMLBuilder.Append("<table border='1px' cellpadding='1' cellspacing='1' bgcolor='lightyellow' style='font-family:Garamond; font-size:smaller'>"); //Close tags. strHTMLBuilder.Append("</table>"); strHTMLBuilder.Append("</body>"); strHTMLBuilder.Append("</html>"); string Htmltext = strHTMLBuilder.ToString(); return Htmltext; }
其实我们可以先做一个网页模板,然后替换掉里面的数据就可以了,这样子换模版方便,也容易修改网页的布局。
2、制作一个模版网页,做为导出时网页的样子
在vs2010中新建一个普通的网页,标题和数据的部分做个标记,用于后续的替换。
<!DOCTYPE HTML> <html> <head> <title></title> <!-- 引入样式 --> <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> </head> <body> <div id="app"> <template> <el-row type="flex" class="row-bg" justify="center"> <h3>标题</h3> </el-row> <el-row type="flex" class="row-bg" justify="center"> <el-col :span="20"> <el-table :data="tableData" style="width: 100%" :row-class-name="tableRowClassName">> <el-table-column prop="名称" label="名称" width="180" sortable></el-table-column> <el-table-column prop="方式" label="方式" width="180" sortable></el-table-column> <el-table-column prop="设备类型" label="设备类型" sortable></el-table-column> <el-table-column prop="地址" label="地址"></el-table-column> <el-table-column prop="验证结果" label="验证结果" sortable></el-table-column> <el-table-column prop="验证时间" label="验证时间"></el-table-column> </el-table> </el-col> </el-row> </template> </div> </body> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/element-ui/lib/index.js"></script> <script> new Vue({ el: '#app', data: function () { return { tableData:| } }, methods: { tableRowClassName({row, rowIndex}) { if (row.验证结果 === "验证失败") { return 'warning-row'; } else { return 'success-row'; } return ''; } }, }) </script> <style> .el-row { margin-bottom: 20px; &:last-child { margin-bottom: 0; } } .el-col { border-radius: 4px; } .bg-purple-dark { background: #99a9bf; } .bg-purple { background: #d3dce6; } .bg-purple-light { background: #e5e9f2; } .grid-content { border-radius: 4px; min-height: 36px; } .row-bg { padding: 10px 0; background-color: #f9fafc; } <style> .el-table .warning-row { background: #F56C6C; } h3 { color:#409EFF; } .el-table .warning-row { background: #F56C6C; } </style> </html>
3、对网页模版进行替换并保存
/// <summary> /// DataTable转换为JSON /// </summary> /// <param name="table"></param> /// <returns></returns> public string DataTableToJsonWithJsonNet(DataTable table) { string JsonString = string.Empty; JsonString = JsonConvert.SerializeObject(table); return JsonString; }
//保存巡检的结果信息 string FileName = ""; DataTable Dt = new DataTable(); Dt.Columns.Add("名称"); Dt.Columns.Add("方式"); Dt.Columns.Add("设备类型"); Dt.Columns.Add("地址"); Dt.Columns.Add("验证结果"); Dt.Columns.Add("验证时间"); string mc = ""; string fs = ""; string sblx = ""; string dz = ""; string yzjg = ""; string yzsj = DateTime.Now.ToString(); for (int i = 0; i < DG_show.Rows.Count - 1; i++) { mc = DG_show.Rows[i].Cells["名称"].Value.ToString().Trim(); fs = DG_show.Rows[i].Cells["方式"].Value.ToString().Trim(); sblx = DG_show.Rows[i].Cells["设备类型"].Value.ToString().Trim(); dz = DG_show.Rows[i].Cells["地址"].Value.ToString().Trim(); yzjg = DG_show.Rows[i].Cells["验证结果"].Value.ToString().Trim(); Dt.Rows.Add(mc, fs, sblx, dz, yzjg, yzsj); }
//导出为网页版的日志记录 FileName = @"data\\服务器巡检记录" + yzsj.Replace(":", "-") + ".htm"; //设置要保存的网页的名称,加上时间信息 string json = hr.DataTableToJsonWithJsonNet(Dt); //把DataTable转换成JSON格式 string text = System.IO.File.ReadAllText("template.htm"); //读取模版网页 text = text.Replace("|", json); //把模版中|替换成真实的数据 text = text.Replace("标题", "服务器巡检记录,生成于:"+DateTime.Now.ToString());//把模版中的标题替换成真实的标题 System.IO.File.WriteAllText(FileName, text); //保存生成的网页 MessageBox.Show("服务器巡检记录已保存,请转至软件Data目录下查看!", "服务器巡检提醒", MessageBoxButtons.OK, MessageBoxIcon.Information);
最后的效果如下图,表格还可以排序