直接先上效果圖看看先。
首先簡單說明一下,后面會給所涉及到的代碼都貼上來的。
1.excel圖標是一個用戶控件,用來觸發下載
2.首頁、上頁......每頁多少條,這一塊是一個整體,你可以選擇放置在表格下面,或者表格上面都可以
3.表格則也是單獨的一個,自己任意設置位置
4.復選框是否顯示,自己設置,並可設置綁定的值,並有自帶的方法可供你用於獲取選中的復選框的對象跟值
5.表格的單行、雙行、點擊、懸浮、標題欄、表格的樣式,都可以通過設置參數來修改,圖為自帶的效果
6.分頁默認每頁10行,分頁的檢測、復選框選擇的檢測,都已封裝好
7.每頁顯示的數量、以及跳轉到第幾頁的事件也都已經寫好
8.關於導出按鈕的數據導出功能,數據查詢的時候,將數據綁定到用戶控件中,而導出按鈕則用來檢測是否有復選框,如果有復選框,則用來先檢測用戶選中的進行拼接導出
功能大概就上面這些了吧,先給調用的方法貼上來。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CommonTable.aspx.cs" Inherits="ChildrenPageFolder_CommonTable" %> <%@ Register TagPrefix="uc" TagName="tn_export" Src="~/UserControl/DataExport.ascx" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>添加表格</title> <script src="../js/CommonHtmlOperation.js" type="text/javascript"></script> <script language="javascript" type="text/javascript"> function PageInfoEvent() { var sql = "select count(*) from camera_fault t"; var sqlQueryCount = ChildrenPageFolder_CommonTable.GetFaultCount(sql).value; // 從后台獲取一個總數 CommonJS.HtmlTableOperation.LoadPageTool("div_PageInfo", sqlQueryCount, TableDataEvent); // 調用分頁加載的方法,傳入:divID,總數,回調函數 } function TableDataEvent(nowPage) { var sql = "select * from camera_fault t"; var dt = ChildrenPageFolder_CommonTable.GetFault(sql, nowPage, CommonJS.HtmlTableOperation.ShowItemCount).value; // 從后台獲取數據,DataTable類型 // 設置顯示的列名,每一列綁定的值 CommonJS.HtmlTableOperation.Fields = ["CF_TYPE:故障類型", "CF_CREATEUSERNAME:申報人姓名", "CF_CREATEUSERID:申報人ID", "CF_CREATETIME:申報時間"]; CommonJS.HtmlTableOperation.SetCheckbox(true, "CF_CAMERAID"); // 設置是否顯示復選框,以及復選框綁定那個列,傳數據庫的列名進去 // 綁定行事件 // CommonJS.HtmlTableOperation.trClickFun = trC; // CommonJS.HtmlTableOperation.trDblclickFun = trC; // CommonJS.HtmlTableOperation.trMouseFun = trC; // CommonJS.HtmlTableOperation.trOutFun = trC; CommonJS.HtmlTableOperation.LoadData("div_TableData", dt); // 加載數據。傳遞 divID 以及 DataTable } // 獲取用戶選中的復選框的value值 function GetCheckedValue() { CommonJS.HtmlTableOperation.GetCheckedValue("div_TableData"); } // 行的方法,返回行對象 function trC(obj) { alert(obj.innerHTML); } </script> </head> <body onload="PageInfoEvent();TableDataEvent(1);"> <form id="form1" runat="server"> <uc:tn_export runat="server" ID="uc_export" /> <div id="div_PageInfo"> </div> <div id="div_TableData"> </div> </form> </body> </html>
簡單說說代碼的調用:
1.自己定義好兩個div,一個用戶控件。兩個div呢,一個是放置上一頁下一頁的位置,另外一個div則用來放置table的位置,至於用戶控件,放上來之后,可以隱藏,也可以顯示,這個隨意。
2.PageInfoEvent的三行代碼,只需要理解第三行代碼就夠了,第二行的代碼通過ajax從后台獲取一個總數。而第三行代碼則是調用封裝的封裝代碼,你需要傳入三個參數,一個參數是分頁按鈕顯示的div的ID,之后就是總數,最后一個是回調函數,該回調函數是用來當分頁觸發之后調用的方法,封裝的方法會返回一個頁數回來。
3.TableDataEvent事件中,獲取頁數。從后台查詢該頁的數據
之后里面有各種參數設置,比如:顯示的列名、每個列對應綁定的數據列、是否顯示復選框、復選框綁定哪個列、設置每頁顯示的數量、行的單擊雙擊懸浮離開事件的綁定、表格的顏色,皆可自定義設置,當然,你若不設置,也都可以,都有默認值。
4.此處需要注意的是:數據類型暫時限制了C#中的DataTable類型,因為現有的項目全是這個類型的,所以先用這個數據類型來寫這個例子,如果要用其它類型,自己改代碼
5.后面還有兩個方法,一個是GetCheckedValue,是獲取用戶選中的值。TrC呢,是在加載table數據的時候,你綁定了回調方法,那么就在回調的時候,將當前行的對象返回給你自定義
下面是自己封裝好的JS方法了
/// <summary> /// table 控件操作方式 /// <summary> var CommonJS = {}; CommonJS.HtmlTableOperation = (function () { /// <summary> /// 靜態公有方法跟屬性 /// <summary> var TableEvent = { // 表格涉及到的樣式 tableCss: "font-size:13px;", trTitleCss: "text-align:center; COLOR: white; BACKGROUND-COLOR: #5d7b9d;", trCss1: "color: #000000;background-color: #ffffee;", trCss2: "color: #993300;background-color: #ffffaa;", trMouseCss: "color: #123456;background-color: #eaa;", trClickCss: "color: white;background-color: #6060F4;", /// <summary> /// 設置需要初始化的變量 /// <summary> Fields: new Array(), // 需要顯示的字段,表列名 DispField: new Array(), // 需要顯示的字段,中文名 ShowItemCount: 10, // 設置每頁顯示的數量 // 是否顯示復選框以及復選框綁定的字段 IsShowCheckbox: false, CheckboxField: "", SetCheckbox: function (isShow, field) { this.IsShowCheckbox = isShow; this.CheckboxField = field; }, trClickFun: null, trDblclickFun: null, trMouseFun: null, trOutFun: null, /// <summary> /// 加載表格數據 /// <summary> LoadData: function (divId, dt) { if (dt != null && dt != undefined) { document.getElementById(divId).innerHTML = ""; var excelHead = ""; var excelBody = ""; // 整理好顯示的列 if (this.Fields.length == 0) { for (var i = 0; i < dt.Columns.length; i++) { this.DispField.push(dt.Columns[i].Name); } this.Fields = this.DispField; } else { var temFields = new Array(); var temDispField = new Array(); for (var i = 0; i < this.Fields.length; i++) { temFields.push(this.Fields[i].split(":")[0]); temDispField.push(this.Fields[i].split(":")[1]); } this.Fields = temFields; this.DispField = temDispField; } // 確定是否需要顯示復選框 var td_ckAll = null; var ck_CheckboxAll = null; var ck_checkboxIdAll = tableCheckboxAllId = divId + "_CheckboxAll"; var ck_checkboxItemName = tableCheckboxItemName = divId + "_CheckboxItem"; if (this.IsShowCheckbox) { ck_CheckboxAll = CreateElement("input"); ck_CheckboxAll.type = "checkbox"; ck_CheckboxAll.title = "全選/全不選"; ck_CheckboxAll.id = ck_checkboxIdAll; ck_CheckboxAll.setAttribute("checkboxItemName", ck_checkboxItemName); ck_CheckboxAll.onclick = function (e) { TableCheckboxCheckAll(this); } td_ckAll = CreateElement("td"); td_ckAll.appendChild(ck_CheckboxAll); } // 創建表格的標題行 var thead = CreateElement("thead"); var thead_tr = CreateElement("tr"); thead_tr.style.cssText = this.trTitleCss; if (this.IsShowCheckbox) { thead_tr.appendChild(td_ckAll); } for (var i = 0; i < this.DispField.length; i++) { var thead_tr_td = CreateElement("td"); thead_tr_td.innerHTML = this.DispField[i]; thead_tr.appendChild(thead_tr_td); excelHead += this.DispField[i] + "\t"; } thead.appendChild(thead_tr); // 創建表格的數據行 var tbody = CreateElement("tbody"); for (var i = 0; i < dt.Rows.length && i < this.ShowItemCount; i++) { var tbody_tr = CreateElement("tr"); var tr_titleMsg = ""; if (this.IsShowCheckbox) { // 復選框 var ck_CheckboxItem = CreateElement("input"); ck_CheckboxItem.type = "checkbox"; ck_CheckboxItem.id = ck_checkboxItemName; ck_CheckboxItem.name = ck_checkboxItemName; ck_CheckboxItem.setAttribute("checkboxAllId", ck_checkboxIdAll); ck_CheckboxItem.value = dt.Rows[i][this.CheckboxField] == undefined ? "" : dt.Rows[i][this.CheckboxField]; ck_CheckboxItem.onclick = function () { TableCheckboxCheck(this); } var tbody_tr_td_checkbox = CreateElement("td"); tbody_tr_td_checkbox.appendChild(ck_CheckboxItem); tbody_tr.appendChild(tbody_tr_td_checkbox); } // 數據內容 for (var j = 0; j < this.Fields.length; j++) { var tbody_tr_td = CreateElement("td"); tbody_tr_td.innerHTML = dt.Rows[i][this.Fields[j]]; tbody_tr.appendChild(tbody_tr_td); tr_titleMsg += this.DispField[j] + ":" + dt.Rows[i][this.Fields[j]] + "\r\n"; excelBody += tbody_tr_td.innerHTML + "\t"; } excelBody += "\n"; tbody_tr.title = tr_titleMsg.substring(0, tr_titleMsg.length - 2); // 添加行的title提示內容 if (i % 2 == 1) { tbody_tr.style.cssText = this.trCss2; } else { tbody_tr.style.cssText = this.trCss1; } tbody_tr.setAttribute("trNowClass", tbody_tr.style.cssText); // 數據行的事件綁定 tbody_tr.onclick = function () { trClickEvent(this); } tbody_tr.ondblclick = function () { trDblclickEvent(this); } tbody_tr.onmouseover = function () { trMouseEvent(this); } tbody_tr.onmouseout = function () { trOutEvent(this); } tbody.appendChild(tbody_tr); } // 將拼接的內容放置到表格中,並添加到頁面 var table = CreateElement("table"); table.style.cssText = this.tableCss; table.appendChild(thead); table.appendChild(tbody); document.getElementById(divId).appendChild(table); BindExcelExportData(excelHead, excelBody); } }, /// <summary> /// 加載分頁信息 /// <summary> LoadPageTool: function (divId, itemCount, callback) { var pageDivObject = document.getElementById(divId); var buttonCss = "padding:2px; margin:2px; "; var spanCss = "padding:2px; font-size:13px; "; // 頁碼 { var spanInfo = CreateElement("span"); spanInfo.id = "span_" + divId; var pageCount = Math.floor(itemCount / this.ShowItemCount) if (itemCount % this.ShowItemCount != 0) { pageCount++; } spanInfo.setAttribute("attr_PageCount", pageCount); spanInfo.setAttribute("attr_NowPage", 1); spanInfo.setAttribute("attr_ItemCount", itemCount); spanInfo.setAttribute("attr_PageItemCount", this.ShowItemCount); spanInfo.setAttribute("attr_TxtNowPage", "txt_NowPage_" + divId); var spanInfo1 = CreateElement("span"); spanInfo1.innerHTML = "當前第"; var spanInfo2 = CreateElement("span"); spanInfo2.innerHTML = "/" + pageCount + "頁 共" + itemCount + "項"; var txtNowPage = CreateElement("input"); txtNowPage.id = "txt_NowPage_" + divId; txtNowPage.type = "text"; txtNowPage.size = 2; txtNowPage.value = 1; txtNowPage.title = "輸入數值后按回車鍵觸發"; txtNowPage.style.cssText = "font-weight: bold;color: Blue; text-align: center;"; txtNowPage.onkeyup = function () { this.value = this.value.replace(/\D/g, ''); } txtNowPage.onafterpaste = function () { this.value = this.value.replace(/\D/g, ''); } txtNowPage.onblur = function () { alert("離開事件"); } spanInfo.style.cssText = spanCss; spanInfo.appendChild(spanInfo1); spanInfo.appendChild(txtNowPage); spanInfo.appendChild(spanInfo2); var spanPageItemCount = CreateElement("span"); var spanPageItemCount1 = CreateElement("span"); spanPageItemCount1.innerHTML = " 每頁顯示"; var spanPageItemCount2 = CreateElement("span"); spanPageItemCount2.innerHTML = "條"; var txtPageItemCount = CreateElement("input"); txtPageItemCount.type = "text"; txtPageItemCount.size = 2; txtPageItemCount.value = this.ShowItemCount; txtPageItemCount.title = "輸入數值后按回車鍵觸發"; txtPageItemCount.style.cssText = "font-weight: bold;color: Blue; text-align: center;"; txtPageItemCount.onkeyup = function () { this.value = this.value.replace(/\D/g, ''); } txtPageItemCount.onafterpaste = function () { this.value = this.value.replace(/\D/g, ''); } txtPageItemCount.onblur = function () { UpdateItemCount(divId, itemCount, this.value, callback); } spanPageItemCount.style.cssText = spanCss; spanPageItemCount.appendChild(spanPageItemCount1); spanPageItemCount.appendChild(txtPageItemCount); spanPageItemCount.appendChild(spanPageItemCount2); } // 按鈕 { var btnFirst = CreateElement("input"); btnFirst.type = "button"; btnFirst.value = "首頁"; btnFirst.title = btnFirst.value; btnFirst.id = divId + "_FirstButtonId"; btnFirst.style.cssText = buttonCss; btnFirst.onclick = function (e) { PageEvent(spanInfo, "first", callback); } var btnPre = CreateElement("input"); btnPre.type = "button"; btnPre.value = "上頁"; btnPre.title = btnPre.value; btnPre.style.cssText = buttonCss; btnPre.onclick = function (e) { PageEvent(spanInfo, "pre", callback); } var btnNext = CreateElement("input"); btnNext.type = "button"; btnNext.value = "下頁"; btnNext.title = btnNext.value; btnNext.style.cssText = buttonCss; btnNext.onclick = function (e) { PageEvent(spanInfo, "next", callback); } var btnEnd = CreateElement("input"); btnEnd.type = "button"; btnEnd.value = "尾頁"; btnEnd.title = btnEnd.value; btnEnd.style.cssText = buttonCss; btnEnd.onclick = function (e) { PageEvent(spanInfo, "end", callback); } var btnExport = CreateElement("input"); btnExport.type = "button"; btnExport.value = "導出"; btnExport.title = btnEnd.value; btnExport.style.cssText = buttonCss; btnExport.onclick = function (e) { DataExportToExcel(); } } pageDivObject.innerHTML = ""; pageDivObject.appendChild(btnFirst); pageDivObject.appendChild(btnPre); pageDivObject.appendChild(btnNext); pageDivObject.appendChild(btnEnd); pageDivObject.appendChild(btnExport); pageDivObject.appendChild(CreateElement("br")); pageDivObject.appendChild(spanInfo); pageDivObject.appendChild(spanPageItemCount); }, /// <summary> /// 獲取用戶選中的項 /// <summary> GetCheckedValue: function (divId) { return divId + "_CheckboxItem"; } }; /// <summary> /// 私有屬性 /// <summary> { // 綁定為當前選中的行,用來行變色使用 var trClickRowObject = null; // 表格的全選復選框ID跟數據的復選框NAME var tableCheckboxAllId = ""; var tableCheckboxItemName = ""; } /// <summary> /// 私有方法 /// <summary> { /// <summary> /// 分頁及復選框使用的方法 /// <summary> { /// <summary> /// 當更換每頁顯示的數量時 /// <summary> var UpdateItemCount = function (divId, itemCount, pageItemCount, callback) { CommonJS.HtmlTableOperation.ShowItemCount = pageItemCount; CommonJS.HtmlTableOperation.LoadPageTool(divId, itemCount, callback); callback(1); } /// <summary> /// 頁面跳轉檢測 /// <summary> var PageEvent = function (spanPage, type, callback) { var pageCount = spanPage.getAttribute("attr_PageCount"); var nowPage = spanPage.getAttribute("attr_NowPage"); var itemCount = spanPage.getAttribute("attr_ItemCount"); var pageItemCount = spanPage.getAttribute("attr_PageItemCount"); var txtNowPage = spanPage.getAttribute("attr_TxtNowPage"); var newPage = nowPage; switch (type) { case "first": if (nowPage == 1) { alert("已經是首頁!"); return; } else { nowPage = 1; } break; case "pre": if (nowPage - 1 < 1) { alert("已經是首頁!"); return; } else { nowPage = nowPage - 1; } break; case "next": if (nowPage + 1 > pageCount) { alert("已經是尾頁!"); return; } else { nowPage = nowPage + 1; } break; case "end": if (nowPage == pageCount) { alert("已經是尾頁!"); return; } else { nowPage = pageCount; } break; } spanPage.setAttribute("attr_NowPage", nowPage); // spanPage.innerHTML = "當前第" + nowPage + "/" + pageCount + "頁 共" + itemCount + "項"; document.getElementById(txtNowPage).value = nowPage; // 回調,返回用戶需要的參數 callback(nowPage); } /// <summary> /// 全選按鈕事件、單個復選框點擊 /// <summary> var TableCheckboxCheckAll = function (obj) { var cks = document.getElementsByName(obj.getAttribute("checkboxItemName")); for (var i = 0; i < cks.length; i++) { cks[i].checked = obj.checked; } } var TableCheckboxCheck = function (obj) { var ckAllObj = document.getElementById(obj.getAttribute("checkboxAllId")); var ckNames = document.getElementsByName(obj.name); for (var i = 0; i < ckNames.length; i++) { ckAllObj.checked = ckNames[i].checked if (!ckNames[i].checked) { break; } } } } /// <summary> /// 數據行涉及的事件:單擊、雙擊、懸浮、離開... /// <summary> { function trClickEvent(trObj) { if (trClickRowObject != trObj && trClickRowObject != null) { trClickRowObject.style.cssText = trClickRowObject.getAttribute("trNowClass"); } trObj.style.cssText = CommonJS.HtmlTableOperation.trClickCss; trClickRowObject = trObj if (CommonJS.HtmlTableOperation.trClickFun != null) { CommonJS.HtmlTableOperation.trClickFun(trObj); } } function trDblclickEvent(trObj) { if (CommonJS.HtmlTableOperation.trDblclickFun != null) { CommonJS.HtmlTableOperation.trDblclickFun(trObj); } } function trMouseEvent(trObj) { if (trClickRowObject != trObj) { trObj.style.cssText = CommonJS.HtmlTableOperation.trMouseCss; } if (CommonJS.HtmlTableOperation.trMouseFun != null) { CommonJS.HtmlTableOperation.trMouseFun(trObj); } } function trOutEvent(trObj) { if (trClickRowObject != trObj) { trObj.style.cssText = trObj.getAttribute("trNowClass"); } if (CommonJS.HtmlTableOperation.trOutFun != null) { CommonJS.HtmlTableOperation.trOutFun(trObj); } } } /// <summary> /// 將查詢出來的數據綁定到導出的隱藏變量中 /// <summary> function BindExcelExportData(headStr, bodyStr) { // var ucFn = document.getElementById("uc_export_hf_fileName"); // if (ucFn != null && ucFn != undefined) { // var fileName = "Excel_" + (new Date()).toLocaleDateString() + ".xls"; // fileName.replace("年", "_").replace("月", "_").replace("日", ""); // document.getElementById("uc_export_hf_fileName").value = fileName; // } var ucH = document.getElementById("uc_export_hf_headStr"); if (ucH != null && ucH != undefined) { document.getElementById("uc_export_hf_headStr").value = headStr; } var ucB = document.getElementById("uc_export_hf_bodyStr"); if (ucB != null && ucB != undefined) { document.getElementById("uc_export_hf_bodyStr").value = bodyStr; } } function DataExportToExcel() { // 檢測用戶選中項 var ckAll = document.getElementById(tableCheckboxAllId); var cks = document.getElementsByName(tableCheckboxItemName); if (ckAll != null) { var headStr = GetCheckedRowStr(ckAll); var bodyStr = ""; if (ckAll.checked) { for (var i = 0; i < cks.length; i++) { bodyStr += GetCheckedRowStr(cks[i]) + "\n"; } } else { for (var i = 0; i < cks.length; i++) { if (cks[i].checked) { bodyStr += GetCheckedRowStr(cks[i]) + "\n"; } } } BindExcelExportData(headStr, bodyStr); } // 調用下載事件 var ucD = document.getElementById("uc_export_img_downExcel"); if (ucD != null && ucD != undefined) { document.getElementById("uc_export_img_downExcel").click(); } } function GetCheckedRowStr(ckObj) { var textArr = ckObj.parentElement.parentElement.childNodes; var trStr = ""; for (var i = 1; i < textArr.length; i++) { trStr += textArr[i].innerText + "\t"; } return trStr; } /// <summary> /// 創建節點對象 /// <summary> var CreateElement = function (elementName) { return document.createElement(elementName); } } return TableEvent; })();
下面的是ajax調用的后台的兩個方法,一個是獲取總數,一個是獲取數據
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; public partial class ChildrenPageFolder_CommonTable : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { AjaxPro.Utility.RegisterTypeForAjax(typeof(ChildrenPageFolder_CommonTable)); } /// <summary> /// 執行傳入的sql獲取報障的數據 /// </summary> /// <param name="sql"></param> /// <returns></returns> [AjaxPro.AjaxMethod] public DataTable GetFault(string sql, int pageNum, int itemCount) { int beginNum = (pageNum - 1) * itemCount; int endNum = pageNum * itemCount; string fenyeSql = "select * from(select a.*,rownum r from (" + sql + ") a where rownum <= " + endNum + ") b where r > " + beginNum; DataTable dt = DataAccessManager.GetDataTable(fenyeSql, "PGISAPP"); return dt; } /// <summary> /// 統計sql的總數 /// </summary> /// <param name="sql"></param> /// <returns></returns> [AjaxPro.AjaxMethod] public int GetFaultCount(string sql) { int count = DataAccessManager.GetItemsCount(sql, "PGISAPP"); return count; } }
接下來的兩個是用戶控件的前台代碼跟后台代碼
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DataExport.ascx.cs" Inherits="UserControl_DataExport" %> <asp:ImageButton ID="img_downExcel" runat="server" ImageUrl="~/images/excel.png" ToolTip="導出Excel" Width="26px" Height="26px" ImageAlign="AbsMiddle" onclick="img_downExcel_Click" /> <asp:HiddenField ID="hf_fileName" runat="server" Value="" /> <asp:HiddenField ID="hf_headStr" runat="server" Value="" /> <asp:HiddenField ID="hf_bodyStr" runat="server" Value="" />
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class UserControl_DataExport : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { } /// <summary> /// /// </summary> protected void img_downExcel_Click(object sender, ImageClickEventArgs e) { try { // 創建標題行 string excelHead = ""; string[] dhs = new string[] { "標題1", "標題2" }; for (int i = 0; i < dhs.Length; i++) { excelHead += dhs[i] + "\t"; } // 創建數據行 string excelBody = ""; for (int i = 0; i < 2; i++) { for (int j = 0; j < 10; j++) { excelBody += "" + j + "\t"; } excelBody += "\n"; } excelHead = this.hf_headStr.Value; excelBody = this.hf_bodyStr.Value; DownExcel(excelHead, excelBody); } catch (Exception ex) { } } /// <summary> /// Excel下載輸出 /// </summary> /// <param name="fileName">文件名稱</param> /// <param name="headStr">標題欄</param> /// <param name="bodyStr">內容主體</param> public void DownExcel(string headStr,string bodyStr) { // 文件名稱 string fileName = "Excel_" + System.DateTime.Now.ToShortDateString() + ".xls"; // 或者 .et Response.Clear(); Response.Buffer = true; System.IO.StringWriter sw = new System.IO.StringWriter(); sw.WriteLine(headStr); sw.WriteLine(bodyStr); sw.Close(); Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName); Response.ContentType = "application/ms-excel"; Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); Response.Write(sw); Response.End(); } }
嘿嘿,大功告成,整個過程如上,有問題再聯系。
另外,若轉載,請添加轉載說明,該文為自己原創的,有好的建議,一塊學習,一塊修改進步,謝謝!