none
Llenar DataTable con Excel

    Question

  • Hola,

    Necesito llenar un DataTable con una consulta sql como esta; "SELECT DISTINCT nombreColumna FROM hoja1$", pero la hoja en la cual estan los datos no tiene titulo de columna y la primera fila (que es la que tengo que consultar) tiene fecha y hora, dejo imagen para mayor detalle

    código utilizado;

        Public Shared Function ObtenerFecha(ByVal hojaExcel As String, ByVal cadena As String)
            Using cnn As New OleDbConnection(cadena.ToString())
                Dim sql As String = "select Distinct f1* from [" & hojaExcel & "]"
                Dim dt As New DataTable
                Dim da As New OleDbDataAdapter(sql, cnn)
                da.Fill(dt)
                Return (dt)
            End Using
        End Function

    resultado esperado, una única fila con 08-06-2012

    Gracias

    Saludos


    Mauricio Hernández

    Wednesday, June 20, 2012 10:30 PM

Answers

  • "mauriciohz" escribió:

    > Necesito llenar un DataTable con una consulta sql
    > como esta; "SELECT DISTINCT nombreColumna FROM hoja1$",
    > pero la hoja en la cual estan los datos no tiene titulo
    > de columna y la primera fila (que es la que tengo que
    > consultar) tiene fecha y hora

    Hola, Mauricio:

    En primer lugar habría que ver qué propiedades extendidas has especificado en la cadena de conexión, porque si la primera fila de la hoja de Excel no tiene el nombre de las columnas, hay que indicar el valor HDR=No en el parámetro Extended Properties de la cadena de conexión.

    Y en segundo lugar, mientras que en los valores de las celdas de la primera columna exista la parte de la hora, de nada sirve especificar el predicado DISTINCT ya que todas las filas son diferentes, porque aunque la fecha sea idéntica la hora no es así, lo que hará que el valor de cada fila sea distinto.

    > resultado esperado, una única fila con 08-06-2012

    Si ese es el resultado que deseas obtener, para nada necesitas un objeto DataTable, por lo que la función ObtenerFecha lo que debería de devolver es un valor DateTime con la fecha correspondiente al primer campo (F1) de la primera fila de la hoja de Excel llamada Hoja1:

        Public Shared Function ObtenerFecha( _
         ByVal hojaExcel As String, ByVal cadena As String) As DateTime
         
         Try
          Using cnn As New OleDbConnection(cadena)
           
           Dim cmd As OleDbCommand = cnn.CreateCommand()
           
           cmd.CommandText = "SELECT F1 FROM [" & hojaExcel & "]"
           
           cnn.Open()
           
           Dim dr As OleDbDataReader = _
            cmd.ExecuteReader(CommandBehavior.CloseConnection)
           
           If (dr.HasRows) Then
            
            dr.Read()
                    
            Dim value As DateTime = dr.GetDateTime(0)
            
            ' Devolvemos solamente la parte de la fecha
            '
            Return value.Date
            
           End If
           
           Throw New ArgumentException("No existe ninguna fila.")
           
          End Using
          
         Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador
          '
          Throw
         End Try
         
        End Function

    Y llamarías a la función de la siguiente manera:

         Try
          ' Cadena de conexión con un archivo de Excel 2007-2010.
          '
          Dim cadenaConexion As Stringn = _
           "Provider=Microsoft.ACE.OLEDB.12.0;" & _
           "Data Source=C:\Mis documentos\Libro1.xlsx;" & _
           "Extended Properties='Excel 12.0 Xml;HDR=No'"
          
          Dim fecha As DateTime = ObtenerFecha("Hoja1$", cadenaConexion)
          
          MessageBox.Show(fecha.ToShortDateString())
          
         Catch ex As Exception
          MessageBox.Show(ex.Message)
          
         End Try

    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.

    • Marked as answer by mauriciohz Thursday, June 21, 2012 9:01 PM
    Thursday, June 21, 2012 8:34 AM
    Moderator

All replies

  • Creo que si es necesario que tenga Encabezados cada Columna, o cual es el error que te manda?
    Thursday, June 21, 2012 2:07 AM
  • "mauriciohz" escribió:

    > Necesito llenar un DataTable con una consulta sql
    > como esta; "SELECT DISTINCT nombreColumna FROM hoja1$",
    > pero la hoja en la cual estan los datos no tiene titulo
    > de columna y la primera fila (que es la que tengo que
    > consultar) tiene fecha y hora

    Hola, Mauricio:

    En primer lugar habría que ver qué propiedades extendidas has especificado en la cadena de conexión, porque si la primera fila de la hoja de Excel no tiene el nombre de las columnas, hay que indicar el valor HDR=No en el parámetro Extended Properties de la cadena de conexión.

    Y en segundo lugar, mientras que en los valores de las celdas de la primera columna exista la parte de la hora, de nada sirve especificar el predicado DISTINCT ya que todas las filas son diferentes, porque aunque la fecha sea idéntica la hora no es así, lo que hará que el valor de cada fila sea distinto.

    > resultado esperado, una única fila con 08-06-2012

    Si ese es el resultado que deseas obtener, para nada necesitas un objeto DataTable, por lo que la función ObtenerFecha lo que debería de devolver es un valor DateTime con la fecha correspondiente al primer campo (F1) de la primera fila de la hoja de Excel llamada Hoja1:

        Public Shared Function ObtenerFecha( _
         ByVal hojaExcel As String, ByVal cadena As String) As DateTime
         
         Try
          Using cnn As New OleDbConnection(cadena)
           
           Dim cmd As OleDbCommand = cnn.CreateCommand()
           
           cmd.CommandText = "SELECT F1 FROM [" & hojaExcel & "]"
           
           cnn.Open()
           
           Dim dr As OleDbDataReader = _
            cmd.ExecuteReader(CommandBehavior.CloseConnection)
           
           If (dr.HasRows) Then
            
            dr.Read()
                    
            Dim value As DateTime = dr.GetDateTime(0)
            
            ' Devolvemos solamente la parte de la fecha
            '
            Return value.Date
            
           End If
           
           Throw New ArgumentException("No existe ninguna fila.")
           
          End Using
          
         Catch ex As Exception
          ' Devolvemos la excepción al procedimiento llamador
          '
          Throw
         End Try
         
        End Function

    Y llamarías a la función de la siguiente manera:

         Try
          ' Cadena de conexión con un archivo de Excel 2007-2010.
          '
          Dim cadenaConexion As Stringn = _
           "Provider=Microsoft.ACE.OLEDB.12.0;" & _
           "Data Source=C:\Mis documentos\Libro1.xlsx;" & _
           "Extended Properties='Excel 12.0 Xml;HDR=No'"
          
          Dim fecha As DateTime = ObtenerFecha("Hoja1$", cadenaConexion)
          
          MessageBox.Show(fecha.ToShortDateString())
          
         Catch ex As Exception
          MessageBox.Show(ex.Message)
          
         End Try

    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.

    • Marked as answer by mauriciohz Thursday, June 21, 2012 9:01 PM
    Thursday, June 21, 2012 8:34 AM
    Moderator
  • Hola Enrique 

    con el código que detallas arriba me funciono bien, era lo que esperaba

    Muchas grasias

    Saludos



    Mauricio Hernández

    Thursday, June 21, 2012 9:01 PM