<asp:SqlDataSource ID="sqldsCustomers" runat="server" SelectCommand="select * from UserDetails" SelectCommandType="Text" ConnectionString="server=server;database=LegalWindow;Trusted_Connection=yes;" /> <asp:GridView ID="gvCustomers" runat="server" AllowPaging="true" AllowSorting="true" PageSize="10″" DataSourceID="sqldsCustomers" GridLines="Both" /> <asp:Button ID="btnExportGrid" runat="server" Text="Export to Excel" OnClick="BtnExportGrid_Click" />
|
Default.aspx.cs :
protected void BtnExportGrid_Click(object sender, EventArgs args) { // pass the grid that for exporting …
GridViewExportUtil.Export(“Customers.xls”, this.gvCustomers); }
|
GridViewExportUtil.cs
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();
// 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(); } } }
//Export Gridview Data to Excel File and Save Excel file to Server Folder Rather than
//allowing user to Open or Save it.
public static void ExportToFolder(string fileName, GridView gv) {
System.Text.StringBuilder sb = new System.Text.StringBuilder();
using (StringWriter sw = new StringWriter(sb)) { using (HtmlTextWriter htw = new HtmlTextWriter(sw)) { // Create a form to contain the grid
Table table = new Table();
// 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);
//Create file
System.IO.TextWriter w = new System.IO.StreamWriter(HttpContext.Current.Server.MapPath("~") + "\\" + fileName); w.Write(sb.ToString()); w.Flush(); w.Close();
} } }
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")); }
if (current.HasControls()) { GridViewExportUtil.PrepareControlForExport(current); } } }
|
For the case where I actually wanted all rows exported, I turned off paging and rebound the grid before sending the control to the export utility. For exporting just the first 100 rows, I set the PageSize property to 100 and then rebound. You should probably use care when exporting the complete GridView just in case your grid has a few more rows that you are expecting. Here is the code for the export button click handler
protected void BtnExportGrid_Click(object sender, EventArgs args) { if (this.rdoBtnListExportOptions.SelectedIndex == 1) { // the user wants all rows exported, turn off paging
// and rebing the grid before sending it to the export
// utility
this.gvCustomers.AllowPaging = false; this.gvCustomers.DataBind(); } else if (this.rdoBtnListExportOptions.SelectedIndex == 2) { // the user wants just the first 100,
// adjust the PageSize and rebind
this.gvCustomers.PageSize = 100; this.gvCustomers.DataBind(); }
// pass the grid that for exporting …
GridViewExportUtil.Export("Customers.xls", this.gvCustomers); }
|
阅读(1782) | 评论(0) | 转发(0) |