Bueno, lo primero es añadir la referencia Microsoft.Office.Interop.Excel, dependiendo del Office que tengas podrás usar la versión 11 (hasta 2003) o la 12 (2007 jiji).
Bueno en resumen, lo que hago es, crear tres variables, que una sera el programa, el libro y otra la hoja. Luego solo nos queda escribir, y te saldrá un bonito cuento :)
Aquí os dejo la función, no es nada difícil de comprender.
Function GridAExcel(ByVal ElGrid As DataGridView) As Boolean
'Creamos las variables
Dim exApp As New Microsoft.Office.Interop.Excel.Application
Dim exLibro As Microsoft.Office.Interop.Excel.Workbook
Dim exHoja As Microsoft.Office.Interop.Excel.Worksheet
Try
'Añadimos el Libro al programa, y la hoja al libro
exLibro = exApp.Workbooks.Add
exHoja = exLibro.Worksheets.Add()
' ¿Cuantas columnas y cuantas filas?
Dim NCol As Integer = ElGrid.ColumnCount
Dim NRow As Integer = ElGrid.RowCount
'Aqui recorremos todas las filas, y por cada fila todas las columnas y vamos escribiendo.
For i As Integer = 1 To NCol
exHoja.Cells.Item(1, i) = ElGrid.Columns(i - 1).Name.ToString
'exHoja.Cells.Item(1, i).HorizontalAlignment = 3
Next
For Fila As Integer = 0 To NRow - 1
For Col As Integer = 0 To NCol - 1
exHoja.Cells.Item(Fila + 2, Col + 1) = ElGrid.Rows(Fila).Cells(Col).Value
Next
Next
'Titulo en negrita, Alineado al centro y que el tamaño de la columna se
ajuste al texto
exHoja.Rows.Item(1).Font.Bold = 1
exHoja.Rows.Item(1).HorizontalAlignment = 3
exHoja.Columns.AutoFit()
'Aplicación visible
exApp.Application.Visible = True
exHoja = Nothing
exLibro = Nothing
exApp = Nothing
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "Error al exportar a Excel")
'http://programaciontotal.blogspot.com
Return False
End Try
Return True
End Function
La función devuelve un True o un False, dependiendo si el resultado ha sido satisfactorio.
Si quieres también le puedes añadir un ProgressBar e ir sumándole uno al valor del Progress dentro del For.
Para llamar a la función es:
GridAExcel(nombreDeTuGrid)
Saludos