1. 程式人生 > >DataGrid 匯出到 Excel 的幫助類

DataGrid 匯出到 Excel 的幫助類

//=============================================================================== 
//// 從 DataGrid    或資料來源中匯出資料到 Excel 並提示下載的幫助類。 
//// Author:    Neil Chen (木野狐) 
// Date:    2005-1-27 
// Version: 1.22 
// History: 
//            v1.00    使用靜態方法的形式實現該類,提供多種過載方式。 
//            v1.01    添加了對 DevExpress.Web.ASPxGrid.ASPxGrid 的直接匯出支援。 
//            v1.20    改寫為實體類。 減少了重複程式碼。 
//            v1.21    2005-2-1     
//                    修改了一個建構函式的過載形式中異常檢測的程式碼。延遲到 Export() 方法。 
//            v1.22    2005-2-3     
//                    1. 修正了 Export() 方法中缺少 _titles != null 判斷的 bug. 
//                    2. 修正了長的數字被 Excel 自動轉換為科學計數法的毛病。 
//                        (修改的辦法來自 
http://dotnet.aspx.cc
////=============================================================================== namespace RChen.Demos { 
    
using System; 
    
using System.IO; 
    
using System.Data; 
    
using System.Web; 
    
using System.Web.UI; 
    
using System.Web.UI.WebControls; 
    
using System.Text; 
    
using
 System.Globalization; 
    
using System.Collections; 
    
using DevExpress.Web.ASPxGrid; 
 
    
publicclass ExcelHelper { 
        
#region Fields string _fileName; 
        DataTable _dataSource;         
        
string[] _titles =null
        
string[] _fields =null
        
int _maxRecords =1000
 
        
#endregion#region Properties ///<summary>/// 限制輸出到 Excel 的最大記錄數。超出則丟擲異常 
        
///</summary>publicint MaxRecords { 
            
set { _maxRecords = value; } 
            
get { return _maxRecords; } 
        } 
 
        
///<summary>/// 輸出到瀏覽器的 Excel 檔名 
        
///</summary>publicstring FileName { 
            
set { _fileName = value; } 
            
get { return _fileName; } 
        } 
 
        
#endregion#region .ctor ///<summary>/// 建構函式 
        
///</summary>///<param name="titles">要輸出到 Excel 的列標題的陣列</param>///<param name="fields">要輸出到 Excel 的欄位名稱陣列</param>///<param name="dataSource">資料來源</param>public ExcelHelper(string[] titles, string[] fields, DataTable dataSource): this(titles, dataSource)        { 
            
if (fields ==null|| fields.Length ==0
                
thrownew ArgumentNullException("fields"); 
 
            
if (titles.Length != fields.Length) 
                
thrownew ArgumentException("titles.Length != fields.Length""fields"); 
             
            _fields 
= fields;             
        } 
 
        
///<summary>/// 建構函式 
        
///</summary>///<param name="titles">要輸出到 Excel 的列標題的陣列</param>///<param name="dataSource">資料來源</param>public ExcelHelper(string[] titles, DataTable dataSource): this(dataSource) { 
            
if (titles ==null|| titles.Length ==0
                
thrownew ArgumentNullException("titles"); 
            
//if (titles.Length != dataSource.Columns.Count) 
            
//    throw new ArgumentException("titles.Length != dataSource.Columns.Count", "dataSource");  
            _titles 
= titles;             
        } 
 
        
///<summary>/// 建構函式 
        
///</summary>///<param name="dataSource">資料來源</param>public ExcelHelper(DataTable dataSource) { 
            
if (dataSource ==null
                
thrownew ArgumentNullException("dataSource"); 
            
// maybe more checks needed here (IEnumerable, IList, IListSource, ) ??? 
            
// 很難判斷,先簡單的使用 DataTable  
            _dataSource 
= dataSource; 
        } 
         
        
public ExcelHelper() {} 
 
        
#endregion#region public Methods ///<summary>/// 匯出到 Excel 並提示下載 
        
///</summary>///<param name="dg">DataGrid</param>publicvoid Export(DataGrid dg) { 
            
if (dg ==null
                
thrownew ArgumentNullException("dg"); 
            
if (dg.AllowPaging || dg.PageCount >1
                
thrownew ArgumentException("paged DataGrid can't be exported.""dg"); 
 
            
// 新增標題樣式             dg.HeaderStyle.Font.Bold =true
            dg.HeaderStyle.BackColor 
= System.Drawing.Color.LightGray; 
 
            RenderExcel(dg); 
        } 
 
        
///<summary>/// 匯出到 Excel 並提示下載 
        
///</summary>///<param name="xgrid">ASPxGrid</param>publicvoid Export(DevExpress.Web.ASPxGrid.ASPxGrid xgrid) {  
            
if (xgrid ==null
                
thrownew ArgumentNullException("xgrid"); 
            
if (xgrid.PageCount >1
                
thrownew ArgumentException("paged xgird not can't be exported.""xgrid"); 
 
            
// 新增標題樣式             xgrid.HeaderStyle.Font.Bold =true
            xgrid.HeaderStyle.BackColor 
= System.Drawing.Color.LightGray; 
 
            RenderExcel(xgrid); 
        } 
 
        
///<summary>/// 匯出到 Excel 並提示下載 
        
///</summary>publicvoid Export() { 
            
if (_dataSource ==null
                
thrownew Exception("資料來源尚未初始化"); 
 
            
if (_fields ==null&& _titles !=null&& _titles.Length != _dataSource.Columns.Count)  
                
thrownew Exception("_titles.Length != _dataSource.Columns.Count"); 
             
            
if (_dataSource.Rows.Count > _maxRecords) 
                
thrownew Exception("匯出資料條數超過限制。請設定 MaxRecords 屬性以定義匯出的最多記錄數。"); 
 
            DataGrid dg 
=new DataGrid(); 
            dg.DataSource 
= _dataSource; 
 
            
if (_titles ==null) { 
                dg.AutoGenerateColumns 
=true
            }  
            
else { 
                dg.AutoGenerateColumns 
=false
                
int cnt = _titles.Length; 
 
                System.Web.UI.WebControls.BoundColumn col; 
 
                
if (_fields ==null) { 
                    
for (int i=0; i<cnt; i++) { 
                        col 
=new System.Web.UI.WebControls.BoundColumn(); 
                        col.HeaderText 
= _titles[i]; 
                        col.DataField 
= _dataSource.Columns[i].ColumnName; 
                        dg.Columns.Add(col); 
                    } 
                } 
                
else { 
                    
for (int i=0; i<cnt; i++) { 
                        col 
=new System.Web.UI.WebControls.BoundColumn(); 
                        col.HeaderText 
= _titles[i]; 
                        col.DataField 
= _fields[i]; 
                        dg.Columns.Add(col); 
                    } 
                } 
            } 
 
            
// 新增標題樣式             dg.HeaderStyle.Font.Bold =true
            dg.HeaderStyle.BackColor 
= System.Drawing.Color.LightGray; 
            dg.ItemDataBound 
+=new DataGridItemEventHandler(DataGridItemDataBound); 
 
            dg.DataBind(); 
            RenderExcel(dg); 
        } 
 
        
#endregion#region private Methods privatevoid RenderExcel(Control c) { 
            
// 確保有一個合法的輸出檔名 if (_fileName ==null|| _fileName ==string.Empty ||!(_fileName.ToLower().EndsWith(".xls"))) 
                _fileName 
= GetRandomFileName(); 
 
            HttpResponse response 
= HttpContext.Current.Response; 
             
            response.Charset 
="GB2312"
            response.ContentEncoding 
= Encoding.GetEncoding("GB2312"); 
            response.ContentType 
="application/ms-excel/msword"
            response.AppendHeader(
"Content-Disposition""attachment;filename="+  
                HttpUtility.UrlEncode(_fileName)); 
 
            CultureInfo cult 
=new CultureInfo("zh-CN"true); 
            StringWriter sw 
=new StringWriter(cult);             
            HtmlTextWriter writer 
=new HtmlTextWriter(sw); 
 
            writer.WriteLine(
"<meta http-equiv=\"Content-Type\" content=\"text/html;charset=GB2312\">"); 
 
            DataGrid dg 
= c as DataGrid; 
             
            
if (dg !=null) { 
                dg.RenderControl(writer); 
            } 
            
else { 
                ASPxGrid xgrid 
= c as ASPxGrid; 
 
                
if (xgrid !=null
                    xgrid.RenderControl(writer); 
                
elsethrownew ArgumentException("only supports DataGrid or ASPxGrid.""c");     
            } 
            c.Dispose(); 
 
            response.Write(sw.ToString()); 
            response.End(); 
        } 
 
 
        
///<summary>/// 得到一個隨意的檔名 
        
///</summary>///<returns></returns>privatestring GetRandomFileName() { 
            Random rnd 
=new Random((int) (DateTime.Now.Ticks)); 
            
string s = rnd.Next(Int32.MaxValue).ToString(); 
            
return DateTime.Now.ToShortDateString() +"_"+ s +".xls"
        } 
 
        
privatevoid DataGridItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e) { 
            
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { 
                e.Item.Attributes.Add(
"style""vnd.ms-excel.numberformat:@"); 
                
//e.Item.Cells[3].Attributes.Add("style", "vnd.ms-excel.numberformat:¥#,###.00");             } 
        } 
 
        
#endregion
    }