La Web del Programador: Comunidad de Programadores
 
    Pregunta:  45524 - COMO EXPORTAR DATAGRID A EXCEL
Autor:  Pablo Saya Báez
Hola, necesito ayuda para exportar a excel los datos de un datagrid.
El datagrid es cargado mediante un dataset.
Si alguien podría darme una mano, se lo agradezco, ya que soy un aficionado a la programación y estoy terminando una aplicación, pero me falta este detalle más que importante.
Gracias a todos

  Respuesta:  Javier Brizuela
http://www.recursosvisualbasic.com.ar/htm/trucos-codigofuente-visual-basic/174-exportar-dbgrid-excel.htm

  Respuesta:  Sebastian Santoro
Hola Pablo, vi que pudiste resolver el tema de la exportación. Traté de hacerlo como vos pero me tira un error, capaz que me podes dar una mano.

cuando le doy al boton que dice Exportar en mi aplicación me tira el siguiente error en la siguiente linea:

myTable = CType(DataGrid1.DataSource, DataTable)

ERROR:

"Excepción no controlada del tipo 'System.InvalidCastException' en Reportes.exe

Información adicional: La conversión especificada no es válida."

Un abrazo.

  Respuesta:  Pablo Saya Báez
Encontré lo que buscaba, aquí les va el código completo:

Dim xlApp As New Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim variable As String
Dim fila, Columna, numcol, x As Integer
Dim myTable As DataTable
Dim FilaExcel As Integer = 2

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
xlBook = CType(xlApp.Workbooks.Add, Excel.Workbook)
xlSheet = CType(xlBook.Worksheets(1), Excel.Worksheet)
Try
Me.Cursor = Cursors.WaitCursor
myTable = CType(DataGrid1.DataSource, DataTable) 'obtengo la estructura del datagrid
numcol = myTable.Columns.Count ' el doc de excel tiene 4 columnas para este e jemplo'''''''''''''''''''
For x = 1 To numcol
xlSheet.Cells(1, x).Font.Bold = True
xlSheet.Cells(1, x).Font.Size = 11
xlSheet.Cells(1, x).Font.Name = "Arial"
Next

For fila = 0 To myTable.Rows.Count - 1 ' numero de filas
For Columna = 0 To myTable.Columns.Count - 1 ' numero de columnas
xlSheet.Cells(1, Columna + 1).value = myTable.Columns(Columna).ColumnName
If IsNumeric(DataGrid1.Item(fila, Columna).ToString) Then
variable = Convert.ToString(DataGrid1.Item(fila, Columna))
ElseIf IsNumeric(DataGrid1.Item(fila, Columna).ToString) Then
variable = Convert.ToString(DataGrid1.Item(fila, Columna))
ElseIf IsDate(DataGrid1.Item(fila, Columna).ToString) Then
variable = Convert.ToString(Microsoft.VisualBasic.Format(DataGrid1.Item(fila, Columna), "Short Date")) ' convierte la fecha en formato 22/11/77
ElseIf IsDBNull(DataGrid1.Item(fila, Columna).ToString) Then
variable = ""
Else
variable = Convert.ToString(DataGrid1.Item(fila, Columna))
End If
xlSheet.Cells(FilaExcel, Columna + 1).value = variable
Next
FilaExcel += 1
Next
xlSheet.Columns.AutoFit()
'Se exporta la hoja Excel cargada en el objeto oExcel a un archivo .XLS
Dim SaveDialog = New SaveFileDialog
SaveDialog.DefaultExt = "*.xls"
SaveDialog.Filter = "(*.xls)|*.xls"
If SaveDialog.ShowDialog = DialogResult.OK Then
Try
xlSheet.SaveAs(SaveDialog.FileName)
Me.Cursor = Cursors.Default
MessageBox.Show("Documento Guardado Como : " & SaveDialog.FileName, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information)
xlBook.Close()
xlApp.Quit()
xlApp = Nothing
Catch ex As Exception
MessageBox.Show("No se Puede Procesar, El Archivo puede que se encuentre abierto, Verifique")
End Try
End If
Catch ex As System.NullReferenceException
MsgBox(ex.Message)
Me.Cursor = Cursors.Default
Exit Sub
End Try

End Sub

NOTA: La exportación a excel se realiza muy lentamente si los registros son grandes. Ej: Una planilla de 2000 registros demora 15 minutos en ser exportada a excel.

hay otra solución, pero se las dejo para que investiguen.

CONSEJO: Lean mucho sobre enlaze de datos.

Un abrazo a todos.