您的位置:首页 > 其它

Some thoughts about exporting GridView to Excel

2006-07-26 22:21 686 查看

Here is an article that helped me once: http://www.codeproject.com/aspnet/DAtaGridExportToExcel.asp. Everything is ok with ASP.NET 1.1, but when I tried to run the same code in a project written in C# 2.0 I got an exception, saying: "Control 'GridView1' of type 'GridView' must be placed inside a form tag with runat=server" (of course I used GridView control instead of DataGrid control). I don't know what was the cause of the error, but I found a workaround: instead of just rendering the whole GridView consider rendering of each GridView row separately. Here is the code illustrating what I'm trying to explain:

Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=Report.xls");
Response.ContentType = "application/excel";
System.IO.StringWriter buffer = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter writer = new HtmlTextWriter(buffer);
writer.WriteLine("<table cellspacing=/"0/", rules=/"all/", border=/"1/">");
GridView1.HeaderRow.RenderControl(writer);
foreach (GridViewRow row in GridView1.Rows)
row.RenderControl(writer);
writer.WriteLine("</table>");
Response.Write(buffer.ToString());
Response.End();

Here is the code I prefer to use now with GridView paging enabled:

Response.Clear();
Response.AddHeader("content-disposition", "attachment;filename=Report.xls");
Response.ContentType = "application/excel";
System.Text.StringBuilder buffer = new System.Text.StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using (XmlWriter writer = XmlTextWriter.Create(buffer, settings))
{
writer.WriteStartElement("table");
writer.WriteAttributeString("cellspacing", "0");
writer.WriteAttributeString("rules", "all");
writer.WriteAttributeString("border", "1");
writer.WriteStartElement("tr");
writer.WriteAttributeString("style", "font-weight:bold");
foreach (TableCell cell in this.GridView1.HeaderRow.Cells)
{
writer.WriteStartElement("td");
writer.WriteValue(cell.Text);
writer.WriteEndElement();
}
writer.WriteEndElement();
using (SqlDataReader reader = SqlHelper.ExecuteReader(
ConfigurationManager.ConnectionStrings[0].ConnectionString, CommandType.Text, "SELECT * FROM TEMP"))
{
while (reader.Read())
{
writer.WriteStartElement("tr");
for (int i = 0; i < reader.FieldCount; i++)
{
writer.WriteStartElement("td");
object data = reader[i];
if (data is DBNull)
writer.WriteValue(string.Empty);
else if (data is DateTime)
writer.WriteValue(string.Format(CultureInfo.CurrentCulture, "{0:d}", data));
else
writer.WriteValue(data);
writer.WriteEndElement();
}
writer.WriteEndElement();
}
}
writer.WriteEndElement();
writer.Flush();
}
Response.Write(buffer.ToString());
Response.End();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: