"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.