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了