es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Leer múltiples hojas de Excel en un ListView.

Estoy intentando leer un archivo de Excel que tiene varias hojas 1,2,3,4,5,6,7,8,9,10.

Necesito leer varias columnas de esas hojas, por ejemplo del rango a1: a20 y c1: c20.

El resultado debe ser listado en un listview. Estoy intentando con varias sugerencias que aparecen en el foro, pero sólo me permite leer una hoja y necesito leer varias al mismo tiempo.

De todas maneras, incluiré el código que estoy usando.

Gracias de antemano.

Public Class Frm_ImportarLibro
    Public Function Obtenerdatos(ByVal ruta As String, ByVal hoja As String, ByVal rango As String) As DataTable

        Dim cadenaConexion As String = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=NO';" & _
                                       "Data Source=" & ruta


        Using cnn As New OleDbConnection(cadenaConexion)


            Dim cmd As OleDbCommand = cnn.CreateCommand()
            cmd.CommandText = String.Format("SELECT * FROM [{0}${1}]", hoja, rango)
            Dim da As New OleDbDataAdapter(cmd)
            Dim dtTemp As New DataTable("Prueba")
            da.Fill(dtTemp)
            Dim dt As DataTable = dtTemp.Clone()
            Dim rows As DataRow() = dtTemp.Select()

            For index As Integer = 0 To rows.Count - 1
                Dim row As DataRow = rows(index)
                If (row.Item(0) Is DBNull.Value) Then
                    Exit For
                End If

                dt.ImportRow(row)
            Next

            Return dt

        End Using

    End Function
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para leer múltiples hojas en un archivo de excel, se puede modificar el código de la función Obtenerdatos usando un bucle para iterar sobre los nombres de las hojas y concatenar los datos en una datatable. Aquí hay un ejemplo:

    Public Function Obtenerdatos(ByVal ruta As String, ByVal hojas As String(), ByVal rango As String) As DataTable
        Dim cadenaConexion As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ruta & ";Extended Properties=""Excel 12.0;HDR=YES;"""
        Dim dt As New DataTable("Prueba")
    
        For Each hoja As String In hojas
            Using cnn As New OleDbConnection(cadenaConexion)
                Dim cmd As OleDbCommand = cnn.CreateCommand()
                cmd.CommandText = String.Format("SELECT * FROM [{0}${1}]", hoja, rango)
                Dim da As New OleDbDataAdapter(cmd)
                Dim dtTemp As New DataTable()
                da.Fill(dtTemp)
                dt.Merge(dtTemp)
            End Using
        Next
    
        Return dt
    End Function
    

    En esta función actualizada, el parámetro hojas es una matriz de nombres de hojas para leer. La datatable dt se inicializa antes del bucle y se fusiona con cada datatable de cada hoja leída en el bucle. Modifique el código según sea necesario para leer columnas específicas y mostrar los datos en un listview.

Comments are closed.