questo è un tipico esempio di come ci si può complicare la vita trasformando una cosa facile in difficile e (a mio avviso) forse anche inutile

Comunque, con quel codice, quel che si manda è una stringa del tipo "<table>***</table>" come documento allegato, con estensione xls

detto questo, togliendo le righe inutili del tuo codice, ho questo:
codice:
Dim dt As DataTable = GetDataTable(gl.StringaConnessioneTest, "select * from tabella")
Dim html As String = getTableFromDataTable(dt)

Response.Clear()
Response.Charset = ""
Response.ContentType = "application/vnd.xls"
Response.AddHeader("Content-Disposition", "attachment;filename=" & "prova".Replace(" ", "_") & "_" & String.Format("{0:yyyyddMMhhmmss}", DateTime.Now) & ".xls")
Response.ContentEncoding = System.Text.Encoding.UTF8
Response.Write(html)
Response.End()
Dim dt As DataTable = GetDataTable(gl.StringaConnessioneTest, "select * from tabella") recupera in un datatable una tabella o vista di database

Dim html As String = getTableFromDataTable(dt) fa la scansione riga per riga, campo per campo del datatable e scrive in una stringa (meglio un stringbuilder)

il resto del codice è quello proposto da te

Alla fine funziona, ma non è un foglio excel vero