导出GridView到Excel#2
我将一个GridView绑定到一个sqldatasource,然后在_rowcreated事件做一些validation,当行不符合要求我隐藏它使用e.Row.Visible = false;
这工作正常,只在gridview中显示正确的行。 现在我有一个导出到Excel的button,除了导出隐藏的行外,这个button也很好用。 我不希望导出隐藏的行。
有没有一种方法,我可以告诉gridview不添加该行,而不是隐藏它? 是否有一个简单的方法来删除所有隐藏行之前我运行导出? 我可以不在导出期间添加隐藏的行吗? 正如你可以在下面的代码中看到的,我试图做到这一点,但它不能识别该行是否可见。
导出代码:
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(); gv.GridLines = GridLines.Both; table.GridLines = gv.GridLines; //table.BackColor = Color.Yellow; // add the header row to the table if (gv.HeaderRow != null) { GridViewExportUtil.PrepareControlForExport(gv.HeaderRow); table.Rows.Add(gv.HeaderRow); //color the header table.Rows[0].BackColor = gv.HeaderStyle.BackColor; table.Rows[0].ForeColor = gv.HeaderStyle.ForeColor; } // add each of the data rows to the table foreach (GridViewRow row in gv.Rows) { if (row.Visible == true) { GridViewExportUtil.PrepareControlForExport(row); table.Rows.Add(row); } } // color the rows bool altColor = false; for (int i = 1; i < table.Rows.Count; i++) { if (!altColor) { table.Rows[i].BackColor = gv.RowStyle.BackColor; altColor = true; } else { table.Rows[i].BackColor = gv.AlternatingRowStyle.BackColor; altColor = false; } } // 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(); } } }
http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html
我从来没有使用GridViewExportUtil,但为什么不编辑他的代码?
private static void PrepareControlForExport(Control control) { for (int i = 0; i < control.Controls.Count; i++) { Control current = control.Controls[i]; //----------------------------- // * my addition if (!current.Visible) continue; //----------------------------- if (current is LinkButton) { control.Controls.Remove(current); control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text)); } else if (current is ImageButton) { //...
下面是将GridView导出到Excel的简单实现:
using System; using System.Data; using System.Configuration; using System.Collections; 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; using System.Data.SqlClient; public partial class ExportGridView : System.Web.UI.Page { protected void Button1_Click(object sender, EventArgs e) { Response.Clear(); Response.AddHeader("content-disposition", "attachment; filename=FileName.xls"); Response.Charset = ""; // If you want the option to open the Excel file without saving than // comment out the line below // Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = "application/vnd.xls"; System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); GridView1.RenderControl(htmlWrite); Response.Write(stringWrite.ToString()); Response.End(); } }
引用博客
首先,为什么你有你的gridview隐藏行? 只获取你想要的数据。 并用此方法导出;
void ExportToExcel(GridView grdData, string filename) { grdData.BorderStyle = BorderStyle.Solid; grdData.BorderWidth = 1; grdData.BackColor = Color.WhiteSmoke; grdData.GridLines = GridLines.Both; grdData.Font.Name = "Verdana"; grdData.Font.Size = FontUnit.XXSmall; grdData.HeaderStyle.BackColor = Color.DimGray; grdData.HeaderStyle.ForeColor = Color.White; grdData.RowStyle.HorizontalAlign = HorizontalAlign.Left; grdData.RowStyle.VerticalAlign = VerticalAlign.Top; HttpResponse response = HttpContext.Current.Response; response.Clear(); response.Charset = ""; response.ContentType = "application/vnd.ms-excel"; response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename+ "\""); using (var sw = new StringWriter()) { using (var htw = new HtmlTextWriter(sw)) { grdData.RenderControl(htw); response.Write(sw.ToString()); response.End(); } } }