GridView导出Excel 类库
using System.Data;
using System.Configuration;
using System.IO;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace Unit
{
public class GridViewExportUtil
{
/// <summary>
/// 把 GridView 呈现的内容导出到 Excel
/// </summary>
/// <param name="fileName"></param>
/// <param name="gv"></param>
public static void Export(string fileName, GridView gv,HttpResponse pageResponse,string filepath)
{
pageResponse.Clear();
pageResponse.Charset = "UTF-8";
pageResponse.Buffer = false;
pageResponse.ClearHeaders();
pageResponse.ContentEncoding = System.Text.Encoding.UTF8;
pageResponse.HeaderEncoding = System.Text.Encoding.UTF8;
pageResponse.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
//pageResponse.ContentType = "application/ms-excel";
pageResponse.ContentType = "application/octet-stream";
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
// Create a form to contain the grid
Table table = new Table();
table.Style.Add("border-top", "solid 1px #cdcdcd");
table.Style.Add("border-left", "solid 1px #cdcdcd");
// add the header row to the table
if (gv.HeaderRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
table.Rows.Add(gv.HeaderRow);
}
// add each of the data rows to the table
foreach (GridViewRow row in gv.Rows)
{
GridViewExportUtil.PrepareControlForExport(row);
table.Rows.Add(row);
}
// add the footer row to the table
if (gv.FooterRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
table.Rows.Add(gv.FooterRow);
}
// render the table into the htmlwriter
table.RenderControl(htw);
string date = System.DateTime.Now.ToString("MMddyyyy");
string outFileName = "ExportExcel_" + date + fileName;
string comPath = "Export/" + outFileName;
string path = filepath + "\\Export";
if (Directory.Exists(path) == false)
{
System.IO.Directory.CreateDirectory(path);
}
path = path + "\\" + outFileName;
System.Text.Encoding encode = System.Text.Encoding.Unicode;
StreamWriter stream = new StreamWriter(path, false, encode);
stream.Write(sw.ToString());
stream.Close();
//stream.Write(sw);
//// render the htmlwriter into the response
pageResponse.Write(sw.ToString());
pageResponse.End();
pageResponse.Flush();
pageResponse.Close();
}
}
}
/// <summary>
/// 把 GridView 呈现的内容导出到 Excel
/// </summary>
/// <param name="fileName"></param>
/// <param name="gv"></param>
public static void Export(string fileName, GridView gv)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName));
HttpContext.Current.Response.ContentType = "application/ms-excel";
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
// Create a form to contain the grid
Table table = new Table();
table.Style.Add("border-top", "solid 1px #cdcdcd");
table.Style.Add("border-left", "solid 1px #cdcdcd");
// add the header row to the table
if (gv.HeaderRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
table.Rows.Add(gv.HeaderRow);
}
// add each of the data rows to the table
foreach (GridViewRow row in gv.Rows)
{
GridViewExportUtil.PrepareControlForExport(row);
table.Rows.Add(row);
}
// add the footer row to the table
if (gv.FooterRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
table.Rows.Add(gv.FooterRow);
}
// render the table into the htmlwriter
table.RenderControl(htw);
// render the htmlwriter into the response
HttpContext.Current.Response.Write(sw.ToString());
HttpContext.Current.Response.End();
}
}
}
/// <summary>
/// 把 GridView 呈现的内容导出到 Excel
/// </summary>
/// <param name="fileName"></param>
/// <param name="gv"></param>
public static string GetExportFileName(string fileName, GridView gv, string filepath)
{
try
{
using (StringWriter sw = new StringWriter())
{
using (HtmlTextWriter htw = new HtmlTextWriter(sw))
{
// Create a form to contain the grid
Table table = new Table();
table.Style.Add("border-top", "solid 1px #cdcdcd");
table.Style.Add("border-left", "solid 1px #cdcdcd");
// add the header row to the table
if (gv.HeaderRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
table.Rows.Add(gv.HeaderRow);
}
// add each of the data rows to the table
foreach (GridViewRow row in gv.Rows)
{
GridViewExportUtil.PrepareControlForExport(row);
table.Rows.Add(row);
}
// add the footer row to the table
if (gv.FooterRow != null)
{
GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
table.Rows.Add(gv.FooterRow);
}
// render the table into the htmlwriter
table.RenderControl(htw);
string date = System.DateTime.Now.ToString("MMddyyyy");
string outFileName = "ExportExcel_" + date + "_" +DateTime.Now.Ticks.ToString() + "_" + fileName;
string comPath = "Export/" + outFileName;
string path = filepath + "\\Export";
if (Directory.Exists(path) == false)
{
System.IO.Directory.CreateDirectory(path);
}
path = path + "\\" + outFileName;
System.Text.Encoding encode = System.Text.Encoding.Unicode;
StreamWriter stream = new StreamWriter(path, false, encode);
stream.Write(sw.ToString());
stream.Close();
return comPath;
}
}
}
catch (Exception e)
{
throw;
}
}
/// <summary>
/// Replace any of the contained controls with literals
/// </summary>
/// <param name="control"></param>
private static void PrepareControlForExport(Control control)
{
for (int i = 0; i < control.Controls.Count; i++)
{
Control current = control.Controls[i];
if (current is LinkButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
}
else if (current is ImageButton)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
}
else if (current is HyperLink)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
}
else if (current is DropDownList)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
}
else if (current is CheckBox)
{
control.Controls.Remove(current);
control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
}
else if (current is System.Web.UI.WebControls.DataControlFieldHeaderCell)
{
((DataControlFieldHeaderCell)current).Style.Add("border-right", "solid 1px #cdcdcd");
((DataControlFieldHeaderCell)current).Style.Add("border-bottom", "solid 1px #cdcdcd");
((DataControlFieldHeaderCell)current).Style.Add("font-family", "arial");
((DataControlFieldHeaderCell)current).Style.Add("color", "#3D3D3D");
((DataControlFieldHeaderCell)current).Style.Add("font-size", "10pt");
((DataControlFieldHeaderCell)current).Style.Add("background-color", "#F1FBFF");
}
else if (current is System.Web.UI.WebControls.DataControlFieldCell)
{
((DataControlFieldCell)current).Style.Add("border-right", "solid 1px #cdcdcd");
((DataControlFieldCell)current).Style.Add("border-bottom", "solid 1px #cdcdcd");
((DataControlFieldCell)current).Style.Add("font-family", "arial");
((DataControlFieldCell)current).Style.Add("color", "#3D3D3D");
((DataControlFieldCell)current).Style.Add("font-size", "10pt");
}
if (current.HasControls())
{
GridViewExportUtil.PrepareControlForExport(current);
}
}
}
}
}
调用方法:
protected void ButtonExportGrid_Click(object sender, EventArgs e)
{
DataTable dtTrListExport = bllTr_list.GetDataList(DatePickerBegintime.StringValue.ToString().Trim(), DatePickerEndtime.StringValue.ToString().Trim());
dtTravellingListExport.Columns.Remove(dtTrListExport .Columns["tr_id"]);
dtTravellingListExport.Columns.Remove(dtTrListExport .Columns["Itinerary"]);
dtTravellingListExport.Columns.Remove(dtTrListExport .Columns["Durat"]);
this.GridViewReport.AllowPaging = false;
this.GridViewReport.DataSource = dtTrListExport ;
this.GridViewReport.DataBind();
string fileName = GridViewExportUtil.GetExportFileName("Customers.xls", this.GridViewReport, Server.MapPath(""));
HttpResponse httpResponse = System.Web.HttpContext.Current.Response;
FileInfo fileinfo = new FileInfo(Server.MapPath("") + @"\" + fileName);
httpResponse.Clear();
httpResponse.ClearHeaders();
httpResponse.Buffer = false;
httpResponse.ContentType = "application/octet-stream";
httpResponse.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileinfo.Name, System.Text.Encoding.UTF8));
//httpResponse.AppendHeader("Content-Length", file.Length.ToString());
httpResponse.WriteFile(fileinfo.FullName);
httpResponse.End();
httpResponse.Flush();
httpResponse.Close();
this.GridViewReport.AllowPaging = true;
}