Quantcast
Channel: Leer hojas de un excel
Viewing all articles
Browse latest Browse all 7

Leer hojas de un excel

$
0
0

"dankito" escribió:

> Estoy intentando leer las hojas que contiene un excel, y por más que
> miro páginas no consigo que me las lea, siempre me muestra como
> nombre "tables" cuando tendría que tener hoja1 y hoja 2.
>
>   Dim table As DataTable = _
>   CType(oledbConn, OleDbConnection).GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)

> AL final lo que he hecho ha sido usar la API de Excel para recoger
> los nombres de las hojas pero me gustaría saber si hay forma de
> recorrer celda por celda desde esa API y si hay forma de volcar
> los datos directamente a un datatable en vez de celda por celda.

Hola:

No es necesario utilizar la API de Excel (la biblioteca de objetos de Microsoft Excel), para obtener los nombres de las hojas de cálculo de un libro de Excel, porque con el ISAM de Excel del motor de datos Microsoft Jet o Microsoft ACE lo puedes hacer de una manera muchísimo más eficaz. Eso sí, hay que saber hacerlo bien, tal y como muestro a continuación:

Imports System.Data.OleDb

    Private Function GetTables(fileName As String) As List(Of String)

        ' Construimos la cadena de conexión con el libro de Excel especificado
        '
        Dim connString As String = _
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _"Extended Properties='Excel 8.0;';" & _"Data Source=" & fileName

        Try
            ' Establecemos la conexión
            '
            Using cnn As New OleDbConnection(connString)

                ' Hay que abrir explícitamente la conexión.
                '
                cnn.Open()

                Using dt As DataTable = cnn.GetSchema("TABLES")

                    Dim query As IEnumerable(Of String) = _
                            From row As DataRow In dt.Rows.Cast(Of DataRow)() _
                            Where CStr(row.Item("TABLE_TYPE")).ToUpperInvariant() = "TABLE" _
                            Order By row.Item("TABLE_NAME") _
                            Select CStr(row.Item("TABLE_NAME"))

                    Return query.ToList()

                End Using

            End Using

        Catch
            ' Devuelvo la excepción al llamador.
            Throw

        End Try

    End Function

Si por casualidad deseas obtener las hojas de un libro de Excel versión 2007 o superior, utiliza la siguiente cadena de conexión:

        Dim connString As String = _
            "Provider=Microsoft.ACE.OLEDB.12.0;" & _
            "Extended Properties='Excel 12.0 Xml;';" & _
            "Data Source=" & fileName

Cuando desees obtener el nombre de las hojas de un libro concreto, llamarías a la función de la siguiente manera:

        Try
            ListBox1.DataSource = GetTables("C:\Mis documentos\Libro1.xls")

        Catch ex As Exception
            ' Se ha producido un error
            MessageBox.Show(ex.Message)

        End Try

En éste caso te aparecerán los nombres en un control ListBox. Te advierto que los nombres de las hojas finalizarán con el carácter $, que es como el ISAM de Excel reconoce los nombres de las hojas de cálculo existentes en un libro de trabajo, y si el nombre de la hoja contiene espacios en blanco, el nombre aparecerá también limitado por comillas simples. Si no deseas que te aparezcan esos caracteres, entonces tendrás que recorres cada elemento de la lista para eliminarlos:

        Try
            Dim hojas As List(Of String) = GetTables("C:\Mis documentos\Libro1.xls")

            For Each hoja As String In hojas

                If (hoja.Contains("$"c)) Then
                    hoja = hoja.Replace("$", String.Empty)
                End If

                If (hoja.Contains("'"c)) Then
                    hoja = hoja.Replace("'", String.Empty)
                End If

                ListBox1.Items.Add(hoja)
            Next

        Catch ex As Exception
            ' Se ha producido un error
            MessageBox.Show(ex.Message)

        End Try

¡Eso es todo! Adapta el ejemplo a tus necesidades.

Un saludo


Enrique Martínez
  [MS MVP - VB]

Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.




Viewing all articles
Browse latest Browse all 7

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>