• Jueves 9 de Mayo de 2024, 19:39

Autor Tema:  ¿exportar Datos De Un Datagrid A Excel?  (Leído 8229 veces)

Joe Potter

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
¿exportar Datos De Un Datagrid A Excel?
« en: Martes 13 de Junio de 2006, 21:56 »
0
Hola soy yo Joe Potter de nuevo con otra duda :(

alguien podria decirme como exportar los datos de un datagrid de Visual C#.net (2002) a Excel.

porfis ayudenme.

dubiweb

  • Nuevo Miembro
  • *
  • Mensajes: 18
    • Ver Perfil
Re: ¿exportar Datos De Un Datagrid A Excel?
« Respuesta #1 en: Miércoles 21 de Junio de 2006, 19:43 »
0
proba con este ejemplo que me encontre por internet

En este ejemplo vamos a aprender como exportar los datos en un DataGrid, DataTable o DataSet a Excel

Descargar Ejemplo ExportarDatosExcel.zip

En nuestras aplicaciones necesitaremos en algun momento exportar datos que tengamos en pantalla a reportes en Excel, aqui te mostraré como hacer esto.

El primer paso sera tener los datos en el objeto que queramos DataGrid, DataSet o DataTable para luego solo invocando una funciones exportar estos datos el Excel.

Vamos a crear un form con un DataGrid para mostrar los datos.

 

Para efectos del ejemplo vamos a llenar el DataGrid con estos datos
Dim dt As New DataTable
Dim dr As DataRow

dt.Columns.Add(New DataColumn("Codigo", GetType(String)))
dt.Columns.Add(New DataColumn("Descripcion", GetType(String)))
dt.Columns.Add(New DataColumn("Valor", GetType(Integer)))

dr = dt.NewRow()
dr("Codigo") = "A"
dr("Descripcion") = "Activo"
dr("Valor") = 1
dt.Rows.Add(dr)

dr = dt.NewRow()
dr("Codigo") = "I"
dr("Descripcion") = "Inactivo"
dr("Valor") = 2
dt.Rows.Add(dr)

dr = dt.NewRow()
dr("Codigo") = "B"
dr("Descripcion") = "Bloqueado"
dr("Valor") = 3
dt.Rows.Add(dr)

Me.dgDatos.DataSource = dt


Ahora, como enviar estos datos el Excel y tener un resultado como el siguiente?

 

Las funciones que vamos a utilizar para exportar a Excel son las siguientes:
Public Sub DataTableToExcel(ByVal pDataTable As DataTable)

  Dim vFileName As String = Path.GetTempFileName()

  FileOpen(1, vFileName, OpenMode.Output)

  Dim sb As String
  Dim dc As DataColumn
  For Each dc In pDataTable.Columns
    sb &= dc.Caption & Microsoft.VisualBasic.ControlChars.Tab
  Next
  PrintLine(1, sb)

  Dim i As Integer = 0
  Dim dr As DataRow
  For Each dr In pDataTable.Rows
    i = 0 : sb = ""
    For Each dc In pDataTable.Columns
      If Not IsDBNull(dr(i)) Then
        sb &= CStr(dr(i)) & Microsoft.VisualBasic.ControlChars.Tab
      Else
        sb &= Microsoft.VisualBasic.ControlChars.Tab
      End If
      i += 1
    Next

    PrintLine(1, sb)
  Next

  FileClose(1)
  TextToExcel(vFileName)

End Sub

Public Sub TextToExcel(ByVal pFileName As String)

  Dim vFormato As Excel.XlRangeAutoFormat

  Dim vCultura As System.Globalization.CultureInfo = _
    System.Threading.Thread.CurrentThread.CurrentCulture
   
  'Es importante definirle la cultura al sistema
  'ya que podria generar errores
  System.Threading.Thread.CurrentThread.CurrentCulture = _
    System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

  Dim Exc As Excel.Application = New Excel.Application
  Exc.Workbooks.OpenText(pFileName, , , , _
    Excel.XlTextQualifier.xlTextQualifierNone, , True)

  Dim Wb As Excel.Workbook = Exc.ActiveWorkbook
  Dim Ws As Excel.Worksheet = Wb.ActiveSheet


  vFormato = Excel.XlRangeAutoFormat.xlRangeAutoFormatSimple
  'En el ejemplo vienen otros formatos posibles
 
  Ws.Range(Ws.Cells(1, 1), _
    Ws.Cells(Ws.UsedRange.Rows.Count, _
    Ws.UsedRange.Columns.Count)).AutoFormat(vFormato)

  pFileName = Path.GetTempFileName.Replace("tmp", "xls")
  File.Delete(pFileName)
 
  Exc.ActiveWorkbook.SaveAs(pFileName, _
    Excel.XlTextQualifier.xlTextQualifierNone - 1)

  Exc.Quit()

  Ws = Nothing
  Wb = Nothing
  Exc = Nothing

  GC.Collect()
  If valor > -1 Then
    Dim p As System.Diagnostics.Process = New System.Diagnostics.Process
    p.EnableRaisingEvents = False
    p.Start("Excel.exe", pFileName)
  End If
  System.Threading.Thread.CurrentThread.CurrentCulture = vCultura
End Sub


Una ves definidos estas funciones solamente nos queda invocarlas para que los datos se reflejen en el Excel.

Si el objeto que tenemos en el DataGrid es un DataTable:
DataTableToExcel(CType(Me.dgDatos.DataSource, DataTable))


Si el objeto que tenemos en el DataGrid es un DataSet:
Dim dt As New DataTable
dt = CType(Me.dgDatos.DataSource, DataSet).Tables(0)
DataTableToExcel(dt)


La funcion DataTableToExcel como su nombre lo indica lo que recibe es un DataTable, asi que hay que tenerlo en cuenta.

Este código fuente es el que recomienda Microsoft para exportar sus datos a Excel, y es importante saber que funciona con Office XP o superior.

Descargar Ejemplo ExportarDatosExcel.zip

Referencias en Microsoft MSDN
- DataTable Object [Excel 2003 VBA Language Reference]
- DataTable Property [Excel 2003 VBA Language Reference]
- A Primer to the Office XP Primary Interop Assemblies

Descargar Ejemplo ExportarDatosExcel.zip

 
Área de Comentarios
Debe estar registrado para poder votar.
Los comentarios si podría hacerlos de forma anónima.
Vote por este artículo:  1 2 3 4 5

Deje su comentario:
 

 


 
Usuario: Anónimo   Fecha: 02/02/2006
++olp+oo''
+`p
ç+
Usuario: Anónimo   Fecha: 03/03/2006
En caso de que en una columna del datagrid tipo string tengamos un valor como este 0003223 que representa un codigo de articulo por ejemplo, a exportar a excel guarda el valor 3223, lo cual no es correcto ya que esta referencia pertenece a otro arículo. Este ejemplo este fallo no lo tiene en cuenta
Usuario: Anónimo   Fecha: 15/03/2006
este ejempo muy interesante
Usuario: Anónimo   Fecha: 29/03/2006
si el objeto que tenemos en el datagrid es un dataview......y queremos mandar a Excel solo las filas que muestra el datagrid (no todas las filas del dataview...porque para llegar a datagrid, llega filtrado).

Gracias.
Usuario: Anónimo   Fecha: 17/05/2006
Excelente aplicación
estoy empezando en esto de la programación y el visual basic.net, es uno
de los lenguajes que me han llamado la atención, junto al C#.net y el Java
pero este visual basic si que me ha sosrprendido,
Gracias por el ejemplo
Usuario: Anónimo   Fecha: 18/05/2006
Muy bueno tu ejemplo, pero lo quize aplicar en un proyecto aspx, pero no pude hacerlo, aca en la empresa hicieron un codigo basado en html para exportar a excell, pero quisiera hacerlo igual que tu ejemplo, he probado pero la libreria Microsoft.Office.Interop no esta disponible en asp .net, espero me puedas ayudar mi msn es javica18@gmail.com gracias
Usuario: Anónimo   Fecha: 01/06/2006
Con Office 2003 no me funciona, cuando llega a la linea

Dim Wb As Excel.Workbook = Exc.ActiveWorkbook

Exc.ActiveWorkbook es Nothing, ¿Alguien sabe como se puede solucionar?