DataGrid 匯出到 Excel 的幫助類
阿新 • • 發佈:2018-12-29
//===============================================================================
//// 從 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
}
}
//// 從 DataGrid 或資料來源中匯出資料到 Excel 並提示下載的幫助類。
//// Author: Neil Chen (木野狐)
// Date: 2005-1-27
// Version: 1.22
// History:
// v1.00 使用靜態方法的形式實現該類,提供多種過載方式。
// v1.01 添加了對 DevExpress.Web.ASPxGrid.ASPxGrid 的直接匯出支援。
// v1.21 2005-2-1
// 修改了一個建構函式的過載形式中異常檢測的程式碼。延遲到 Export() 方法。
// v1.22 2005-2-3
// 1. 修正了 Export() 方法中缺少 _titles != null 判斷的 bug.
// 2. 修正了長的數字被 Excel 自動轉換為科學計數法的毛病。
// (修改的辦法來自
////=============================================================================== 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
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
}
}