lunes, 7 de marzo de 2011

Exportar a Excel desde un DataGridView VB.NET

Hola a todos,
Es esta mi primera publicación, por tanto pedire que se me haga criticas constructivas.
Lo que haremos será:
-- Exportar a excel desde un datagridview
-- Exportar a varias hojas de excel desde un conjunto de datagridview

EXPORTAR A EXCEL DESDE UN DATAGRIDVIEW.

Lo primero que debemos hacer es crear nuestro formulario, insertar el datagridview y le daremos el siguiente formato, para que sea vea un poco mas presentable:

AllowUserToAddRows = False
AllowUserToDeleteRows = False
Archor = Top, Bottom, Left, Right
BackGround = Window
MultiSelect = False
ReadOnly = true
SelectionMode = FullRowSelect

una ves creado nuestro DataGridView lo cargamos y nos deberia quedar con el formulario masomenos asi:



Si queremos que al inciar el datagrid no se seleccione la fila por defecto hacemos lo siguiente en el evento load o el boton que llame al cargar el datagrid:

Me.dgv1.CurrentCell = Nothingme.dgv1.clearselection()

Ahora  procederemos a exportar:

Lo primero que tenemos que hacer es agregar referencia:


Agregada la referencia Procedemos a exportar: en el evento que lo dispara en mi caso un boton exportar:

Private Sub btnExportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExportar.Click

Dim app As Microsoft.Office.Interop.Excel._Application = New Microsoft.Office.Interop.Excel.Application()
Dim workbook As Microsoft.Office.Interop.Excel._Workbook = app.Workbooks.Add(Type.Missing)
Dim worksheet As Microsoft.Office.Interop.Excel._Worksheet = Nothingworksheet = workbook.Sheets("Hoja1")
worksheet = workbook.ActiveSheet
'Aca se agregan las cabeceras de nuestro datagrid.

For i As Integer = 1 To Me.dgvCasosPendientes.Columns.Count
      worksheet.Cells(1, i) = Me.dgvCasosPendientes.Columns(i - 1).HeaderText
Next

'Aca se ingresa el detalle recorrera la tabla celda por celda

For i As Integer = 0 To Me.dgvCasosPendientes.Rows.Count - 1
For j As Integer = 0 To Me.dgvCasosPendientes.Columns.Count - 1
worksheet.Cells(i + 2, j + 1) = Me.dgvCasosPendientes.Rows(i).Cells(j).Value.ToString()
NextNext

'Aca le damos el formato a nuestro excel

worksheet.Rows.Item(1).Font.Bold = 1
worksheet.Rows.Item(1).HorizontalAlignment = 3
worksheet.Columns.AutoFit()
worksheet.Columns.HorizontalAlignment = 2

app.Visible = Trueapp = Nothingworkbook = Nothing
worksheet = NothingFileClose(1)
GC.Collect()
End Sub 
Ahora ejecutamos el programa y el resultado:




Ahora pasamos a la fase 2:
EXPORTAR A VARIAS HOJAS DE EXCEL DESDE VARIOS DATA GRID: VB.Net

Si queremos exportar a un archivo de excel con varias hojas debemos de considerar lo siguiente:
Un DataGridView Será una hoja de excel.

No les dire como llenaran todos los datagridview que necesiten o cual es la mejor forma, lo que yo hize es crear un objeto data set y asignar cada tabla del dataset a un datagridview asi:

Me.DataGridView0.DataSource = ds.Tables(0)
Me.DataGridView1.DataSource = ds.Tables(1)
Me.DataGridView2.DataSource = ds.Tables(2)
Me.DataGridView3.DataSource = ds.Tables(3)
Me.DataGridView4.DataSource = ds.Tables(4)
Me.DataGridView5.DataSource = ds.Tables(5)
Me.DataGridView6.DataSource = ds.Tables(6)
Me.DataGridView7.DataSource = ds.Tables(7)
Me.DataGridView8.DataSource = ds.Tables(8)

Ahora codificacremos para exportar es algo similar al anterior ahi les va el codigo:

Private Sub btnExportar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExportar.Click

' Creacion de la aplicacion en excelDim app As Microsoft.Office.Interop.Excel._Application = New Microsoft.Office.Interop.Excel.Application()
' Creamos nueva hoja de trabajao en la aplicacin excelDim workbook As Microsoft.Office.Interop.Excel._Workbook = app.Workbooks.Add(Type.Missing)
' Creando nueva hoja de trabajo en el libroDim worksheet As Microsoft.Office.Interop.Excel._Worksheet = Nothing'Obtenemos la referencia de la primera hoja que por el momento tiene nombre Hoja1
 worksheet = workbook.Sheets("Hoja3")
worksheet = workbook.Sheets("Hoja2")
worksheet = workbook.Sheets("Hoja1")
worksheet = workbook.ActiveSheet
'creamos nuevas hojasworkbook.Sheets.Add(After:=workbook.Worksheets("Hoja3"))
workbook.Sheets.Add(After:=workbook.Worksheets("Hoja4"))
workbook.Sheets.Add(After:=workbook.Worksheets("Hoja5"))
workbook.Sheets.Add(After:=workbook.Worksheets("Hoja6"))
workbook.Sheets.Add(After:=workbook.Worksheets("Hoja7"))
workbook.Sheets.Add(After:=workbook.Worksheets("Hoja8"))

' Enviamos al excel por hojas'hoja 1For c As Integer = 1 To Me.dgvAmpliatorioDinamico.Columns.Count
workbook.Sheets("Hoja1").Cells(1, c) = Me.dgvAmpliatorioDinamico.Columns(c - 1).HeaderText
NextFor c As Integer = 0 To Me.dgvAmpliatorioDinamico.Rows.Count - 1
For d As Integer = 0 To Me.dgvAmpliatorioDinamico.Columns.Count - 1
workbook.Sheets("Hoja1").Cells(c + 2, d + 1) = Me.dgvAmpliatorioDinamico.Rows(c).Cells(d).Value.ToString()
NextNext'hoja2 For a As Integer = 1 To Me.DataGridView1.Columns.Count
workbook.Sheets("Hoja2").Cells(1, a) = Me.DataGridView1.Columns(a - 1).HeaderText
NextFor a As Integer = 0 To Me.DataGridView1.Rows.Count - 1
For b As Integer = 0 To Me.DataGridView1.Columns.Count - 1
workbook.Sheets("Hoja2").Cells(a + 2, b + 1) = Me.DataGridView1.Rows(a).Cells(b).Value.ToString()
NextNext'hoja3For f As Integer = 1 To Me.DataGridView2.Columns.Count
workbook.Sheets("Hoja3").Cells(1, f) = Me.DataGridView2.Columns(f - 1).HeaderText
NextFor f As Integer = 0 To Me.DataGridView2.Rows.Count - 1
For g As Integer = 0 To Me.DataGridView2.Columns.Count - 1
workbook.Sheets("Hoja3").Cells(f + 2, g + 1) = Me.DataGridView2.Rows(f).Cells(g).Value.ToString()
NextNext
.
.
.'hoja7'hoja8'hoja9
'Damos formato a todas las hojas a traves de una sentencia repetitiva.For l As Integer = 1 To 9
Dim Hoja As String = "Hoja" & l
workbook.Sheets(Hoja).Rows.Item(1).Font.Bold = 1
workbook.Sheets(Hoja).Rows.Item(1).HorizontalAlignment = 3
workbook.Sheets(Hoja).Columns.AutoFit()
workbook.Sheets(Hoja).Columns.HorizontalAlignment = 2
Next
 'Cambiamos el nombre de las hojas  para que se entiendaworkbook.Worksheets("Hoja1").Name = "Cambio de Centro Médico"workbook.Worksheets("Hoja2").Name = "Cambio de Médico Auditor"workbook.Worksheets("Hoja3").Name = "Hospitalizacion"workbook.Worksheets("Hoja4").Name = "Visita Hospitalaria"workbook.Worksheets("Hoja5").Name = "Invalidez"workbook.Worksheets("Hoja6").Name = "Muerte"workbook.Worksheets("Hoja7").Name = "Alta"workbook.Worksheets("Hoja8").Name = "Traslado a Provincia"workbook.Worksheets("Hoja9").Name = "Movilidad"' Para abrir el excelapp.Visible = True'Salir de la aplicacin borrar de memoria, los archivos basura y todo app = Nothingworkbook = Nothingworksheet = NothingFileClose(1)
GC.Collect()
End Sub

y aqui obtenemos el resultado:

Como pueden apreciar se ha creado 9 hojas de excel dentro del archivo y como ven seleccione una hoja al azar y ven todos los datos exportados.

Espero ayudarlos un poco en sus tareas cotidianas. de hecho se pueden hacer muchas modificaciones  para hacerlo mas optimo, y si hacen que funcione mejor pueden compartir aqui en este blog. Gracias.