viernes, abril 19, 2024

Exportar datos 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

Roy Rojas
Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub
Roy Rojas
Roy Rojashttp://www.dotnetcr.com
Con más de 20 años de experiencia en programación, experto en lenguajes .NET, VB, C#, ASP.NET, Xamarin, XCode, DBA en SQL Server. Creador de dotnetcr.com, sitio web para programadores en español. royrojas.com | dotnetcr.com | GitHub