Hopes

          Start Here..

           

          Asp.net中把DataTable或DataGrid導出為Excel

          Asp.net中把DataTable或DataGrid導出為Excel


          當前編碼的一個項目中有把查詢結果(顯示在DataGrid)導出為excel的需求,嘗試了幾種方法,作為技巧拿來和大家分享。 

          內容: 
          服務器端實現DataGrid導出為excel 
          客戶端實現DataGrid導出為excel 
          服務器端實現DataTable導出為excel(終極解決方案) 


           

          服務器端實現DataGrid導出為excel 

          這是網上出現的最多的做法:

           1/// <summary> 
           2        /// 把DataGrid內容導出偉excel并返回客戶端 
           3        /// </summary> 
           4        /// <param name="dgData">待導出的DataGrid</param> 
           5        /// 創 建 人:calvin 
           6        /// 創建日期:2005年10月08日 
           7        /// 修 改 人: 
           8        /// 修改日期: 
           
           9        public static void DataGrid2Excel(System.Web.UI.WebControls.DataGrid dgData) 
          10        
          11            // 當前對話 
          12            System.Web.HttpContext curContext = System.Web.HttpContext.Current; 
          13            // IO用于導出并返回excel文件 
          14            System.IO.StringWriter strWriter = null
          15            System.Web.UI.HtmlTextWriter htmlWriter = null
          16 
          17            if (dgData != null
          18            
          19                // 設置編碼和附件格式 
          20                curContext.Response.ContentType = "application/vnd.ms-excel"
          21                curContext.Response.ContentEncoding =System.Text.Encoding.UTF8; 
          22                curContext.Response.Charset = ""
          23                 
          24                // 導出excel文件 
          25                strWriter = new System.IO.StringWriter(); 
          26                htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter); 
          27 
          28                // 返回客戶端     
          29                dgData.RenderControl(htmlWriter);     
          30                curContext.Response.Write(strWriter.ToString()); 
          31                curContext.Response.End(); 
          32            }
           
          33        }

          在需要導出的地方調用上面的方法就可以。不過這樣的實現有兩個問題:第一,datagrid中不能包含模板列;第二,只能夠導出當前顯示在datagrid的數據,無法在分頁的情況下導出全部的查詢結果。 

          如果大家分析一下Control.RenderControl的方法,就會發現RenderControl只是把控件的innerHTML導出來,既然如此,完全可以把導出操作放在客戶端來處理。 



          客戶端導出excel 

           1 /* 
           2 * 將DataGrid導出為Excel文件 
           3 
           4 * @param strTitle    文件標題 
           5 * @param dgData        待導出的DataGrid 
           6 * @param iStartCol    起始列序號 
           7 * @param iEndCol    結束列序號 
           8 
           9 * 創建人:    calvin 
          10 * 創建日期: 2005-10-08 
          11 * 修改人:     
          12 * 修改日期: 
          13 **/ 
          14  function DataGrid2Excel(strTitle, dgData, iStartCol, iEndCol) 
          15 
          16     // 定義Excel Applicaiton Object 
          17     var appExcel = null
          18     // 當前激活的工作簿 
          19     var currentWork = null
          20     var currentSheet = null
          21      
          22     try 
          23     { 
          24         // 初始化application 
          25         appExcel = new ActiveXObject("Excel.Application"); 
          26         appExcel.Visible = true
          27     } 
          28     catch(e) 
          29     { 
          30         window.alert("Please Install Excel First"); 
          31          
          32         return
          33     } 
          34      
          35     // 獲取當前激活的工作部 
          36     currentWork = appExcel.Workbooks.Add(); 
          37     currentSheet = currentWork.ActiveSheet; 
          38  
          39     // 填充excel內容 
          40     // 設置標題 
          41     currentSheet.Cells(1,1).Value = strTitle; 
          42     currentSheet.Cells(1,1).Value = dgData.innerText; 
          43     window.alert(dgData.innerHTML); 
          44  
          45     // 填充內容 
          46     for (var iRow = 0; iRow < dgData.rows.length - 1; iRow++
          47     { 
          48         // 顯示指定列的內容 
          49         for (var iCol = iStartCol; iCol <= iEndCol; iCol++
          50         { 
          51             currentSheet.Cells(iRow + 2, iCol + 1).Value =  
          52                 dgData.rows[iRow].cells[iCol].innerText; 
          53         } 
          54     } 
          55 }

          下面是調用的例子

          1 /*
          2 * 導出dgData中0-3列的數據到excel文件中 
          3 **/ 
          4 function ToExcel() 
          5 
          6     DataGrid2Excel("使用javascript導出excel的例子", document.getElementsById("dgData"), 03); 
          7 }


          這種方法的缺點是: 
          (1)了能夠在客戶端調用Excel.Application,需要把IE的安全級別設為“低”。 
          (2)與方法一相同,還是只能導出當前顯示在datagrid里面的數據,無法導出分頁的數據。 



          終極解決方案:將DataTable導出為excel 

          好,讓我們快點結束這篇無聊的post。一般來說,頁面上的datagrid是以查詢得到的一個DataTable為數據源的。那么為了把全部數據導入excel中,我們只要把DataTable數據源輸出為excel就可以了。 

           1/// <summary> 
           2        /// 把DataTable內容導出偉excel并返回客戶端 
           3        /// </summary> 
           4        /// <param name="dgData">待導出的DataTable</param> 
           5        /// 創 建 人:陳文凱 
           6        /// 創建日期:2005年10月08日 
           7        /// 修 改 人: 
           8        /// 修改日期:
           
           9        public static void DataTable2Excel(System.Data.DataTable dtData) 
          10        
          11            System.Web.UI.WebControls.DataGrid dgExport = null
          12            // 當前對話 
          13            System.Web.HttpContext curContext = System.Web.HttpContext.Current; 
          14            // IO用于導出并返回excel文件 
          15            System.IO.StringWriter strWriter = null
          16            System.Web.UI.HtmlTextWriter htmlWriter = null
          17 
          18            if (dtData != null
          19            
          20                // 設置編碼和附件格式 
          21                curContext.Response.ContentType = "application/vnd.ms-excel"
          22                curContext.Response.ContentEncoding =System.Text.Encoding.UTF8; 
          23                curContext.Response.Charset = ""
          24                 
          25                // 導出excel文件 
          26                strWriter = new System.IO.StringWriter(); 
          27                htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter); 
          28 
          29                // 為了解決dgData中可能進行了分頁的情況,需要重新定義一個無分頁的DataGrid 
          30                dgExport = new System.Web.UI.WebControls.DataGrid(); 
          31                dgExport.DataSource = dtData.DefaultView; 
          32                dgExport.AllowPaging = false
          33                dgExport.DataBind(); 
          34 
          35                // 返回客戶端 
          36                dgExport.RenderControl(htmlWriter);     
          37                curContext.Response.Write(strWriter.ToString()); 
          38                curContext.Response.End(); 
          39            }
           
          40        }


          需要注意的是,導出excel之前要把datatable的列名更改為客戶要求的文字,就ok了。因為是從DataTable導出的,所以這種方法解決了分頁數據的問題,堪稱終極解決方案。 

          posted on 2012-08-29 09:57 ** 閱讀(405) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          公告

          你好!

          常用鏈接

          留言簿(2)

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          收藏夾

          C#學習

          友情鏈接

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 康保县| 岗巴县| 肇庆市| 贡嘎县| 驻马店市| 新绛县| 鄂州市| 佳木斯市| 山东省| 连南| 垣曲县| 宣城市| 锡林浩特市| 高邑县| 乌什县| 卢湾区| 板桥市| 黄龙县| 治县。| 龙井市| 灵寿县| 台江县| 上高县| 新巴尔虎左旗| 桑植县| 崇礼县| 炎陵县| 杂多县| 泗洪县| 汕尾市| 庆安县| 始兴县| 托里县| 平潭县| 内江市| 临高县| 大新县| 屏山县| 安宁市| 昭觉县| 百色市|