Hola, te paso un codigo para mostrar la forma de como yo lo realizo, espero te ayude.
Código:
If Not GridView1.Rows.Count > 0 Then
clsLN.showMsg("No existen registros para exportar", Me)
Return
End If
Dim sb As StringBuilder = New StringBuilder()
Dim sw As StringWriter = New StringWriter(sb)
Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
Dim pagina As Page = New Page
Dim form = New HtmlForm
GridView1.EnableViewState = False
GridView1.AllowPaging = False
GridView1.AllowSorting = False
Call clsLN.yenaGrif(hfQuery.Value, GridView1)
pagina.EnableEventValidation = False
pagina.DesignerInitialize()
pagina.Controls.Add(form)
form.Controls.Add(GridView1)
pagina.RenderControl(htw)
Response.Clear()
Response.Buffer = True
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader("Content-Disposition", "attachment;filename=ReporteExterno.xls")
Response.Charset = "UTF-8"
Response.ContentEncoding = Encoding.Default
Response.Write(sb.ToString())
Response.End()
solo que el boton de exportar tiene que estar fuera de panel del ajax para que funcione y la grilla si puede estar dentro...