首先下載org.in2bits.MyXls.dll(自己的在~\About ASP.Net\Asp.Net操作excel)
添加命名空間:
using org.in2bits.MyXls;
using System.IO;
思路:
添加引用 (using org.in2bits.MyXls)→ 創建空xls文檔(XlsDocument) → 得到數據 → 創建一個工作頁(Worksheet) → 設置xls文檔的指定工作頁的行(RowInfo) → 設置xls文檔的指定工作頁的列(ColumnInfo) → 創建列樣式創建列時引用(XF) → 列位置排好 → 增加數據(ws.Cells.Add)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using org.in2bits.MyXls; using System.Web; using System.IO; namespace LowProtetction.Bizlogic { public class DB_CommunityInfo { /// <summary> /// 自定義導出 /// </summary> /// <param name="Condition">查詢條件</param> public static void DaoChuExecl( string therCondtion) { string filename = "自定義導出"; DataView dv = null; XlsDocument doc = new XlsDocument(); //創建空xls文檔 string strSql = "select BelongCity,CommunityCode,CommunityName,CommunityAddress,Remark,AddUserName from CommunityInfo where 1=1 " + therCondtion + ""; dv = Epoint.MisBizLogic2.DB.ExecuteDataView(strSql); ExcelExport(filename,dv.ToTable(), doc, 2, 1); doc.FileName = HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8); doc.Send(); } private static void ExcelExport(string workSheetName, DataTable dt, XlsDocument xls, int startrow, int displaynum) { //創建一個工作頁為Dome Worksheet ws = xls.Workbook.Worksheets.Add(workSheetName); #region 設置xls文檔的指定工作頁的行屬性 RowInfo rol1top1 = new RowInfo(); rol1top1.RowHeight = 50 * 20; rol1top1.RowIndexStart = 0; rol1top1.RowIndexEnd = 1; ws.AddRowInfo(rol1top1); RowInfo rol1top2 = new RowInfo(); rol1top2.RowHeight = 24 * 20; rol1top2.RowIndexStart = 2; rol1top2.RowIndexEnd = (ushort)(dt.Rows.Count + 5); //到最后一行 ws.AddRowInfo(rol1top2); #endregion #region 設置xls文檔的指定工作頁的列屬性 //所屬城市 1 ColumnInfo colInfo0 = new ColumnInfo(xls, ws); colInfo0.ColumnIndexStart = 0; colInfo0.ColumnIndexEnd = 1; colInfo0.Width = 15 * 256; ws.AddColumnInfo(colInfo0); //社區編號 ColumnInfo colInfo1 = new ColumnInfo(xls, ws); colInfo1.ColumnIndexStart = 1; colInfo1.ColumnIndexEnd = 2; colInfo1.Width = 15 * 256; ws.AddColumnInfo(colInfo1); //名稱 ColumnInfo colInfo12 = new ColumnInfo(xls, ws); colInfo12.ColumnIndexStart = 2; colInfo12.ColumnIndexEnd = 3; colInfo12.Width = 15 * 256; ws.AddColumnInfo(colInfo12); //社區地址 ColumnInfo colInfo2 = new ColumnInfo(xls, ws); colInfo2.ColumnIndexStart = 3; colInfo2.ColumnIndexEnd = 4; colInfo2.Width = 15 * 256; ws.AddColumnInfo(colInfo2); // 社區介紹 ColumnInfo colInfo3 = new ColumnInfo(xls, ws); colInfo3.ColumnIndexStart = 4; colInfo3.ColumnIndexEnd = 5; colInfo3.Width = 15 * 256; ws.AddColumnInfo(colInfo3); //登記人 ColumnInfo colInfo6 = new ColumnInfo(xls, ws); colInfo6.ColumnIndexStart = 5; colInfo6.ColumnIndexEnd = 7; colInfo6.Width = 15 * 256; ws.AddColumnInfo(colInfo6); #endregion #region 創建列樣式創建列時引用 XF xfhead = xls.NewXF(); xfhead.HorizontalAlignment = HorizontalAlignments.Centered; xfhead.VerticalAlignment = VerticalAlignments.Centered; xfhead.Font.Bold = false; xfhead.Font.FontName = "宋體"; xfhead.Font.Height = 16 * 20; //自動換行 xfhead.TextWrapRight = true; #endregion #region Excel導出的頭 //Worksheet,單元格樣式,列名,開始行,開始列,結束行,結束列 MergeRegion(ref ws, xfhead, "自定義導出", 1, 1, 1, dt.Columns.Count); #endregion #region 創建單元格樣式 //第一種單元格樣式 XF xf = xls.NewXF(); xf.HorizontalAlignment = HorizontalAlignments.Centered; xf.VerticalAlignment = VerticalAlignments.Centered; xf.Pattern = 1;////設定單元格填充風格。如果設定為0,則是純色填充 xf.PatternColor = Colors.White;//設定填充線條的顏色 xf.UseBorder = true; //設置列的上下左右的樣式 xf.TopLineStyle = 1; xf.TopLineColor = Colors.Black; xf.BottomLineStyle = 1; xf.BottomLineColor = Colors.Black; xf.LeftLineStyle = 1; xf.LeftLineColor = Colors.Black; xf.RightLineStyle = 1; xf.RightLineColor = Colors.Black; xf.Font.Bold = true; xf.Font.FontName = "仿宋"; xf.Font.Height = 12 * 20; //自動換行 xf.TextWrapRight = true; #endregion #region 列位置排好 int ViewStatestartrow = startrow; //Worksheet,單元格樣式,列名,開始行,開始列,結束行,結束列 MergeRegion(ref ws, xf, "所屬城市", ViewStatestartrow, 1, ViewStatestartrow, 1); MergeRegion(ref ws, xf, "社區編號", ViewStatestartrow, 2, ViewStatestartrow, 2); MergeRegion(ref ws, xf, "社區名稱", ViewStatestartrow, 3, ViewStatestartrow, 3); MergeRegion(ref ws, xf, "社區地址", ViewStatestartrow, 4, ViewStatestartrow, 4); MergeRegion(ref ws, xf, "社區介紹", ViewStatestartrow, 5, ViewStatestartrow, 5); MergeRegion(ref ws, xf, "登記人", ViewStatestartrow, 6, ViewStatestartrow, 6); #endregion //第二種單元格樣式 XF xf1 = xls.NewXF(); xf1 = xf; xf1.Font.Bold = false; xf1.Font.FontName = "仿宋_GB2312"; xf1.Font.Height = 10 * 20; int ViewStateEndrow = int.Parse(ViewStatestartrow.ToString()); int dtcolcount = dt.Columns.Count; //循環數據表 逐行添加數據 //ViewStatestartrow 為開始行 for (int i = 0; i < dt.Rows.Count; i++) { int StatRow = i + ViewStatestartrow + 1; for (int k = 0; k < dt.Columns.Count; k++) { //行,列,列值,單元格 ws.Cells.Add(StatRow, k + 1, dt.Rows[i][k].ToString(), xf1);//給單元格賦值: } ViewStateEndrow = StatRow; } } /// <summary> /// 格式設置 合並 /// </summary> /// <param name="ws">Worksheet </param> /// <param name="xf"> </param> /// <param name="title"> 列名</param> /// <param name="startRow">開始行</param> /// <param name="startCol">開始列</param> /// <param name="endRow">結束行</param> /// <param name="endCol">結束列</param> public static void MergeRegion(ref Worksheet ws, XF xf, string title, int startRow, int startCol, int endRow, int endCol) { for (int i = startCol; i <= endCol; i++) { for (int j = startRow; j <= endRow; j++) { //行,列,列值,單元格 ws.Cells.Add(j, i, title, xf); } } ws.Cells.Merge(startRow, endRow, startCol, endCol); } } }

還有一個重要的一點就是,彈出下載頁面的時候你電腦要刷屏,這樣是消失不見,而你加了UpdatePanel的話也會刷掉
重點來了
//通過此方法,我們可以把某個位於UpdatePanel中的控件,改為不觸發異步Postback,而是觸發傳統的Postback事件 //不然會把下載框刷新調 ((ScriptManager)Master.FindControl("ScriptManager1")).RegisterPostBackControl(btnExport);
