asp.net+js+ashx如何实现数据导出(EXCEL)
1、<a class="button-a-radius" style="background-color:red;float:left" id="btnReport">导出</a>这句代码是页面中添加了一个导出按钮
2、在js中写一下代码,表示在当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件。由于该事件在文档就绪后发生。因此我们,因此把所有其他的 jQuery 事件和函数置于该事件中。例如导出;$(document).ready(function () {//当导出这个链接触发时,我们执行ReportExcel()方法 $("#btnReport").bind('click', function () { ReportExcel(); });})
3、//这里是导出执行的jquery方法,因为导出数据,必须要先获取要导出的数据,那么我们在这里去访问一般处理程序。function ReportExcel() { var ogk01 = $("#txt_ogk01").val(); var ogk02 = $("#txt_ogk02").val(); var ogk14 = $('#txt_ogk14').combobox('getValue'); $.ajax({ url: '/ashx/axm/AxmReportAjax.ashx?a=1', cache: false, dataType: 'json', type: 'post', data: { ogk01: ogk01, ogk02: ogk02, ogk14: ogk14 }, success: function (json) { if (json && json.success == "1") { $('#excelUrl').attr('href', json.msg)[0].click(); } else { $.messager.alert('系統提示', '導出Excel失敗!', 'warning'); } }, error: function () { if (typeof arguments[2] == "object") { $.errorAlert(arguments[2].message); } else { $.errorAlert(arguments[2]); } } });}
4、这里是一般处理程序的代码string connStr = string.Empty; string msg = string.Empty; public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; try { try { connStr = context.Session["connStr"].ToString(); } catch (Exception) { throw new Exception("timeout"); } string ajax = context.Request["a"]; switch (ajax) { case "1": msg = Export(context); break; } } catch (Exception ex) { msg = StringPlus.ToOpResult(false, ex.Message); } context.Response.Write(msg); context.Response.End(); }private string Export(HttpContext context) { try { string ogk01 = context.Request["ogk01"] ?? ""; string ogk02 = context.Request["ogk02"] ?? ""; string ogk14 = context.Request["ogk14"] ?? ""; OgkFileBll bll = new OgkFileBll(); DataTable excelDt = bll.Export(connStr, ogk01, ogk02, ogk14); string fileName = userID.Trim() + DateTime.Now.ToString("yyyyMMddHHmmssffff") + ".xls"; DataToExcel dte = new DataToExcel(); string filePath = "/sendlog/downLoad/" + fileName; string strHtml = dte.DtToHtml(excelDt); File.WriteAllText(context.Server.MapPath(filePath), strHtml); msg = StringPlus.ToOpResult(true, filePath); } catch (Exception ex) { msg = StringPlus.ToOpResult(false, ex.Message); } return msg; }
5、 这一段是比较重要的,它主要是把获取到的表数据转换为Excel输出,因为我们的目的就是把表数据导出Excel /// <summary> /// DataTable 转换为Excel输出 /// </summary> /// <param name="dt"></param> /// <returns></returns> public string DtToHtml(DataTable dt) { StringBuilder sb = new StringBuilder(); if (dt != null) { //生成<meta>标签 sb.Append("<meta http-equiv=\"content-type\" content=\"application/ms-excel; charset=UTF-8\"/>"); //生成标题列 sb.Append("<table border=\"1\" style=\"background-color:#E8E8FF;font-weight:bold;\"><tr>"); foreach (DataColumn dc in dt.Columns) { sb.Append("<td style=\"text-align:center\">" + dc + "</td>"); } sb.Append("</tr></table>"); } if (dt != null && dt.Rows.Count > 0) { //生成內容 sb.Append("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">"); foreach (DataRow dr in dt.Rows) { sb.Append("<tr>"); for (var i = 0; i < dt.Columns.Count; i++) { sb.Append("<td style=\"text-align:center\">" + Convert.ToString(dr[i]).Trim() + "</td>"); } sb.Append("</tr>"); } sb.Append("</table>"); } return sb.ToString(); }
6、接下来就是关于业务逻辑层和数据访问层的编写了。这些靠自己了。只要实现第四步中的一下代码DataTable excelDt = bll.Export(connStr, ogk01, ogk02, ogk14);获取到excelDt(也就是表数据)就OK了