导出GridView到Excel,而不会丢失Excel中的网格线

我有一个GridView,我想要导出到Excel。 当我使用我在网上find的示例代码时,它将内容导出到Excel中,但由于某种原因,它也清除了我的导出表之外的所有网格线。

对于普通的excel用户来说,这很容易解决,但是我需要这个解决scheme为每个人工作。

那么有没有办法将一个GridView中的数据导出到一个Excel工作簿中,以便它看起来像只是input到Excel中? 我已经粘贴了我在下面使用的代码,假设一个叫做toPrint的GridView存在并且有准确的数据。

Response.Clear(); Response.AddHeader("content-disposition", "attachment; filename=" + name + "_Registration_Forms.xls"); Response.Charset = ""; Response.ContentType = "application/vnd.ms-excel"; Page.EnableViewState = false; System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); toPrint.RenderControl(htmlWrite); Response.Write(stringWrite.ToString()); Response.End(); 

编辑:find一个部分的解决scheme。 如果以逗号分隔的列表forms导出,并将标题设置为CSV文件,则可以正常打开,并显示所有网格线(即使是导出的数据以外的网格线)。 唯一的问题就是在输出之前,必须从我的值中去掉每个逗号和换行符。

下面的post给了我答案。 http://forums.asp.net/t/1074110.aspx我将总结如何处理代码。

 System.IO.StringWriter dvWriter = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter OutputGenerator = new System.Web.UI.HtmlTextWriter(dvWriter); //To put in the excel gridlines dvWriter.Write(@"<html xmlns:x=""urn:schemas-microsoft-com:office:excel"">"); dvWriter.Write(@"<head> <xml> <x:ExcelWorkbook> <x:ExcelWorksheets> <x:ExcelWorksheet> <x:WorksheetOptions> <x:Panes></x:Panes> <x:Print><x:Gridlines /></x:Print> </x:WorksheetOptions> </x:ExcelWorksheet> </x:ExcelWorksheets> </x:ExcelWorkbook> </xml> </head>"); //*******Put your Table Body here ******* 

过去我已经使用了下面的帮助函数。 我只是给用户一个checkbox,他们可以select包括网格线或不。 显然你可以改变这个始终包含网格线。

 namespace Helpers { public class GridViewExportUtil { public static void Export(string fileName, GridView gv, bool includeGridLines) { 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(); if (includeGridLines) { table.GridLines = gv.GridLines; } // 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> /// 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")); } if (current.HasControls()) { GridViewExportUtil.PrepareControlForExport(current); } } } } } 

这是你如何称呼它的一个例子:

 GridViewExportUtil.Export("QueryResults.xls", GridView1, includeGridLines); 

当我导出到Excel时,我有同样的问题没有得到网格线。

我解决这个问题的方法是在<datagrid>标签中放入Gridlines="Both"

VB

 Public Overrides Sub VerifyRenderingInServerForm(control As Control) 'base.VerifyRenderingInServerForm(control); 'This remains empty End Sub Protected Sub btnExcel_Click(sender As Object, e As ImageClickEventArgs) Handles btnExcel.Click Response.Clear() Response.AddHeader("content-disposition", "attachment;filename=FileName.xls") Response.Charset = "" Response.Cache.SetCacheability(HttpCacheability.NoCache) Response.ContentType = "application/vnd.ms-excel" Dim stringWrite As New System.IO.StringWriter() Dim htmlWrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite) htmlWrite.Write("<html xmlns:o=""urn:schemas-microsoft-com:office:office"" ") htmlWrite.Write("xmlns:x=""urn:schemas-microsoft-com:office:excel"" ") htmlWrite.Write("xmlns=""http://www.w3.org/TR/REC-html40""> ") htmlWrite.Write("<head> ") htmlWrite.Write("<!--[if gte mso 9]><xml> ") htmlWrite.Write("<x:ExcelWorkbook> ") htmlWrite.Write("<x:ExcelWorksheets> ") htmlWrite.Write("<x:ExcelWorksheet> ") htmlWrite.Write("<x:Name>Sheet1</x:Name> ") htmlWrite.Write("<x:WorksheetOptions> ") htmlWrite.Write("<x:Selected/> ") htmlWrite.Write("<x:ProtectContents>False</x:ProtectContents> ") htmlWrite.Write("<x:ProtectObjects>False</x:ProtectObjects> ") htmlWrite.Write("<x:ProtectScenarios>False</x:ProtectScenarios> ") htmlWrite.Write("</x:WorksheetOptions> ") htmlWrite.Write("</x:ExcelWorksheet> ") htmlWrite.Write("</x:ExcelWorksheets> ") htmlWrite.Write("</x:ExcelWorkbook> ") htmlWrite.Write("</xml><![endif]--> ") htmlWrite.Write("</head>") htmlWrite.WriteLine("") gridView.HeaderStyle.Reset() gridView.FooterStyle.Reset() gridView.AlternatingRowStyle.Reset() gridView.RowStyle.Reset() gridView.BackColor = Color.Transparent gridView.GridLines = GridLines.None gridView.RenderControl(htmlWrite) Response.Write(stringWrite.ToString()) Response.[End]() End Sub 

C#

 public override void VerifyRenderingInServerForm(Control control) { //base.VerifyRenderingInServerForm(control); //This remains empty } protected void btnExcel_Click(object sender, ImageClickEventArgs e) { Response.Clear(); Response.AddHeader("content-disposition", "attachment;filename=FileName.xls"); Response.Charset = ""; Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = "application/vnd.ms-excel"; System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); htmlWrite.Write("<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" "); htmlWrite.Write("xmlns:x=\"urn:schemas-microsoft-com:office:excel\" "); htmlWrite.Write("xmlns=\"http://www.w3.org/TR/REC-html40\"> "); htmlWrite.Write("<head> "); htmlWrite.Write("<!--[if gte mso 9]><xml> "); htmlWrite.Write("<x:ExcelWorkbook> "); htmlWrite.Write("<x:ExcelWorksheets> "); htmlWrite.Write("<x:ExcelWorksheet> "); htmlWrite.Write("<x:Name>Sheet1</x:Name> "); htmlWrite.Write("<x:WorksheetOptions> "); htmlWrite.Write("<x:Selected/> "); htmlWrite.Write("<x:ProtectContents>False</x:ProtectContents> "); htmlWrite.Write("<x:ProtectObjects>False</x:ProtectObjects> "); htmlWrite.Write("<x:ProtectScenarios>False</x:ProtectScenarios> "); htmlWrite.Write("</x:WorksheetOptions> "); htmlWrite.Write("</x:ExcelWorksheet> "); htmlWrite.Write("</x:ExcelWorksheets> "); htmlWrite.Write("</x:ExcelWorkbook> "); htmlWrite.Write("</xml><![endif]--> "); htmlWrite.Write("</head>"); htmlWrite.WriteLine(""); gridView.HeaderStyle.Reset(); gridView.FooterStyle.Reset(); gridView.AlternatingRowStyle.Reset(); gridView.RowStyle.Reset(); gridView.BackColor = Color.Transparent; gridView.GridLines = GridLines.None; gridView.RenderControl(htmlWrite); Response.Write(stringWrite.ToString()); Response.End(); }