Cómo: Recuperar metadatos de Excel utilizando el método GetOleDbSchemaTable en Visual Basic .NET

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

Haga clic aquí para ver el artículo original (en inglés): 318373
Para obtener una versión de Microsoft Visual C# .NET de este artículo, consulte 318452.

En esta tarea

Resumen
Este artículo paso a paso describe cómo recuperar metadatos de columna y tabla de Microsoft Excel orígenes de datos con el método GetOleDbSchemaTable con el proveedor Microsoft OLE DB administrado y el proveedor OLE DB para Jet.

El método GetOleDbSchemaTable se expone la clase System.Data.OleDb de Microsoft .NET Framework es el sucesor de .NET el método OpenSchema en versiones anteriores de Microsoft ActiveX Data Objects (ADO).

back to the top

Descripción de la técnica

Después de conectarse a un origen de datos de Excel utilizando ADO.NET, extrae una lista de tabla de metadatos mediante GetOleDbSchemaTable y a continuación, utilizar el mismo método con argumentos diferentes para obtener metadatos de columna de la tabla seleccionada. También puede utilizar un objeto DataGridTableStyle para diseñar y dar formato a los resultados de consulta en una cuadrícula de datos.

back to the top

Requisitos

La lista siguiente describe el hardware, el software, la infraestructura y los service pack recomendados que se necesitarán:
  • Visual Studio .NET instalado en un sistema operativo de Microsoft Windows compatible con
  • Al menos un archivo de libro (.xls) de Microsoft Excel con algunas filas y columnas de datos
En el presente artículo se supone que está familiarizado al menos con los conceptos básicos de los temas siguientes:
  • Visual Basic .NET
  • Acceso a los datos de ADO.NET
  • Libros de Excel y hojas de cálculo
back to the top

Ejemplo

  1. Inicie Visual Studio.NET y cree un nuevo proyecto de aplicación de Windows de Visual Basic .NET.
  2. Agregue tres controles de botón y dos controles DataGrid al formulario predeterminado (Form1). Cambie la propiedad Text de los controles Button a Recuperar metadatos , Lista de tablas de formato y Lista de columnas de formato , respectivamente.
  3. Cambie al módulo de código del formulario y agregue las siguientes instrucciones Imports en la parte superior:
    Imports System.DataImports System.Data.OleDbImports System.ComponentModel
  4. Inserte las siguientes declaraciones de nivel de módulo en la clase de formulario después de la línea "Inherits System.Windows.Forms.Form". Ajuste la cadena de conexión según sea necesario para apuntar a un archivo de libro de Excel que contiene algunas filas y columnas de datos.
        Dim cn As OleDbConnection    Dim strCn As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _            "Data Source=c:\test.xls;Extended Properties=Excel 8.0"    Dim dtTables As DataTable    Dim WithEvents cm As CurrencyManager    Dim dtColumns As DataTable    Dim dvColumns As DataView
  5. Inserte el código siguiente en la clase Form después de la región "Código generado por el Diseñador de Windows Forms". Este código llama a GetOleDbSchemaTable para cargar las listas de tabla y columnas, rellena los controles DataGrid y actualiza la lista de columnas cuando cambia de la tabla seleccionada.
        Private Sub Button1_Click(ByVal sender As System.Object, _            ByVal e As System.EventArgs) Handles Button1.Click        Call GetTablesList()    End Sub    Private Sub GetTablesList()        cn = New OleDbConnection(strCn)        cn.Open()        dtTables = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, Nothing)        DataGrid1.DataSource = dtTables        DataGrid1.ReadOnly = True        cn.Close()        Call GetColumnsList()    End Sub    Private Sub GetColumnsList()        If cm Is Nothing Then            cm = CType(Me.BindingContext(dtTables), CurrencyManager)        End If        Dim r As Integer = cm.Position        Dim strTable As String = dtTables.Rows(r)("TABLE_NAME")        cn = New OleDbConnection(strCn)        cn.Open()        dtColumns = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, _            New Object() {Nothing, Nothing, strTable, Nothing})        dvColumns = New DataView(dtColumns)        dvColumns.Sort = "ORDINAL_POSITION"        DataGrid2.DataSource = dvColumns        DataGrid2.ReadOnly = True        cn.Close()    End Sub    Private Sub cm_PositionChanged(ByVal sender As Object, _            ByVal e As System.EventArgs) Handles cm.PositionChanged        Call GetColumnsList()    End Sub
  6. Inserte el siguiente código para diseñar y aplicar formato a tablas DataGrid mediante TableStyles . Observe el uso de PropertyDescriptor para facilitar el formato no predeterminado de las columnas de fecha.
        Private Sub Button2_Click(ByVal sender As System.Object, _            ByVal e As System.EventArgs) Handles Button2.Click        Call FormatTablesGrid(dtTables)    End Sub    Private Sub FormatTablesGrid(ByVal dt2format As DataTable)        Dim gs As DataGridTableStyle = New DataGridTableStyle()        gs.MappingName = dt2format.TableName        Dim cs As DataGridColumnStyle = New DataGridTextBoxColumn()        With cs            .MappingName = "TABLE_NAME"            .HeaderText = "Table Name"            .Width = 75        End With        gs.GridColumnStyles.Add(cs)        cs = New DataGridTextBoxColumn()        With cs            .MappingName = "TABLE_TYPE"            .HeaderText = "Table Type"            .Width = 75        End With        gs.GridColumnStyles.Add(cs)        Dim cm As CurrencyManager = CType(Me.BindingContext(dt2format), CurrencyManager)        Dim pd As PropertyDescriptor = cm.GetItemProperties()("DATE_CREATED")        cs = New DataGridTextBoxColumn(pd, "d")        With cs            .MappingName = "DATE_CREATED"            .HeaderText = "Date Created"            .Width = 75        End With        gs.GridColumnStyles.Add(cs)        cm = CType(Me.BindingContext(dt2format), CurrencyManager)        pd = cm.GetItemProperties()("DATE_MODIFIED")        cs = New DataGridTextBoxColumn(pd, "d")        With cs            .MappingName = "DATE_MODIFIED"            .HeaderText = "Date Modified"            .Width = 75        End With        gs.GridColumnStyles.Add(cs)        DataGrid1.TableStyles.Add(gs)        Me.Button2.Enabled = False    End Sub
  7. Inserte el siguiente código para diseñar y dar formato a las columnas DataGrid utilizando TableStyle :
        Private Sub Button3_Click(ByVal sender As System.Object, _            ByVal e As System.EventArgs) Handles Button3.Click        Call FormatColumnsGrid(dtColumns)    End Sub    Private Sub FormatColumnsGrid(ByVal dt2format As DataTable)        Dim gs As DataGridTableStyle = New DataGridTableStyle()        gs.MappingName = dtColumns.TableName        Dim cs As DataGridColumnStyle = New DataGridTextBoxColumn()        With cs            .MappingName = "COLUMN_NAME"            .HeaderText = "Column Name"            .Width = 100        End With        gs.GridColumnStyles.Add(cs)        cs = New DataGridTextBoxColumn()        With cs            .MappingName = "ORDINAL_POSITION"            .HeaderText = "Ordinal Position"            .Width = 100        End With        gs.GridColumnStyles.Add(cs)        cs = New DataGridTextBoxColumn()        With cs            .MappingName = "DATA_TYPE"            .HeaderText = "Data Type"            .Width = 75        End With        gs.GridColumnStyles.Add(cs)        cs = New DataGridTextBoxColumn()        With cs            .MappingName = "CHARACTER_MAXIMUM_LENGTH"            .HeaderText = "Text Length"            .Width = 75        End With        gs.GridColumnStyles.Add(cs)        cs = New DataGridTextBoxColumn()        With cs            .MappingName = "NUMERIC_PRECISION"            .HeaderText = "Numeric Precision"            .Width = 75        End With        gs.GridColumnStyles.Add(cs)        DataGrid2.TableStyles.Add(gs)        Me.Button3.Enabled = False    End Sub
  8. Ejecute el proyecto.
  9. Haga clic en Recuperar metadatos para rellenar la lista de tablas (DataGrid1) con todas las columnas de información que se devuelven para cada tabla en el libro de Excel mediante GetOleDbSchemaTable . Se rellena la lista de columnas (DataGrid2) al mismo tiempo con todas las columnas de información que se devuelven las columnas de la primera tabla en la lista tablas .
  10. Seleccione una tabla diferente en la lista tablas . Cambia de lista de columnas para mostrar las columnas de la tabla seleccionada del debido cm_PositionChanged controlador de eventos que se ha implementado.
  11. Haga clic en Lista de tablas de formato para definir y aplicar un TableMappingStyle DataGrid1. Esto hace que los encabezados de columna más "descriptivos" y sólo muestra las cuatro columnas de datos útiles de las nueve columnas que son devueltos por GetOleDbSchemaTable . Estas columnas se muestran:
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    No se muestran estas columnas en blanco:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    DESCRIPCIÓN
    TABLE_PROPID
  12. Haga clic en Lista de columnas de formato para definir y aplicar un TableMappingStyle a DataGrid2. Esto hace que los encabezados de columna más "descriptivos" y muestra sólo las 5 columnas más útiles de datos de las 28 columnas que son devueltos por GetOleDbSchemaTable .
    COLUMN_NAME
    ORDINAL_POSITION
    DATA_TYPE
    MAXIMUM_CHARACTER_LENGTH
    NUMERIC_PRECISION
    No se muestran estas columnas en blanco principalmente:
    TABLE_CATALOG
    TABLE_SCHEMA
    Table_name (ya conocido)
    COLUMN_GUID
    COLUMN_PROPID
    COLUMN_HASDEFAULT (siempre es false)
    COLUMN_DEFAULT
    COLUMN_FLAGS
    IS_NULLABLE (siempre es true)
    TYPE_GUID
    CHARACTER_OCTET_LENGTH
    NUMERIC_SCALE
    DATETIME_PRECISION
    CHARACTER_SET_CATALOG
    CHARACTER_SET_SCHEMA
    CHARACTER_SET_NAME
    COLLATION_CATALOG
    COLLATION_SCHEMA
    COLLATION_NAME
    DOMAIN_CATALOG
    DOMAIN_SCHEMA
    NOMBREDEDOMINIO
    DESCRIPCIÓN
  13. Haga clic en una fila diferente de DataGrid1 para seleccionar una tabla diferente. La lista de columnas se actualiza automáticamente. Los TableStyles aplicadas anteriormente a cada DataGrid efectivos.
back to the top

Solución de problemas

  • Los tipos de datos de columna que se devuelven por GetOleDbSchemaTable para un origen de datos de Excel no son idénticos en todos los casos a los tipos de datos que se devuelven por el método OpenSchema en ADO clásico:
    Tipo de columnaADO CLÁSICOADO.NET (OLE DB)
    Numérico5 adDouble5 OleDbType.Double
    Moneda6 adCurrency6 OleDbType.Currency
    Fecha y horaadDate 7OleDbType.Date 7
    BooleanadBoolean 11OleDbType.Boolean 11
    Texto < 255202 adVarWChar130 OleDbType.WChar
    MemorandoadLongVarWChar 203130 OleDbType.WChar
  • GetOleDbSchemaTable , como OpenSchema , devuelve una sola columna "F1" de una hoja de cálculo vacía de Excel, aunque en realidad no títulos de datos o columna están presentes.
back to the top
Referencias
Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
257819Cómo: Usar ADO con datos de Excel desde Visual Basic o desde VBA
back to the top

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 318373 - Última revisión: 09/03/2003 22:57:40 - Revisión: 2.1

Microsoft Visual Basic .NET 2003 Standard Edition, Microsoft Visual Basic .NET 2002 Standard Edition, Microsoft ADO.NET 1.1, Microsoft ADO.NET 1.0

  • kbmt kbhowtomaster kbprovider KB318373 KbMtes
Comentarios