Я использую метод, который использует метод .RenderControl() самого GridView. При желании вы можете скрыть столбец или два.
public static void ExportGridToExcel(System.Web.UI.Page p_Page, System.Web.UI.WebControls.GridView p_GridView, int[] p_ColumnsToHide)
{
if (p_ColumnsToHide != null)
{
foreach (int i in p_ColumnsToHide)
{
p_GridView.Columns[i].Visible = false;
}//foreach
}//if
p_Page.Response.Clear();
p_Page.Response.Buffer = true;
p_Page.Response.AddHeader("content-disposition", "attachment; filename=output.xls");
p_Page.Response.ContentType = "application/vnd.ms-excel";
p_Page.Response.Charset = string.Empty;
p_Page.EnableViewState = false;
System.IO.StringWriter sw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(sw);
p_GridView.RenderControl(oHtmlTextWriter);
p_Page.Response.Write(sw.ToString());
p_Page.Response.End();
}
Если это не работает из коробки, то есть несколько других вариантов, один из которых вы упомянули ... выписывая поток CSV вручную (я предпочитаю табуляцию себя), а затем лежа к браузеру о том, какой файл вы отправляете, чтобы он открыл его в Exhell. Exhell 2007, к сожалению, дает пользователю предупреждение об этом подходе сейчас, поэтому в зависимости от приложения это может или не может работать для вас.
Другой подход (хотя и тяжелый) заключается в том, чтобы поместить другое изображение сетки на страницу и отправить его этому методу. Преимущество состоит в том, что вы можете легко настроить вывод Exhell отдельно от того, что пользователь видит на экране (то есть yank javascript, добавить столбцы и т. Д.). Недостаток? Разумеется, два gridviews.
Удачи.