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

Seleccione idioma Seleccione idioma
Id. de artículo: 318373 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

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

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.

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

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.Data
    Imports System.Data.OleDb
    Imports 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.

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:
    Contraer esta tablaAmpliar esta tabla
    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.

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

Propiedades

Id. de artículo: 318373 - Última revisión: miércoles, 03 de septiembre de 2003 - Versión: 2.1
La información de este artículo se refiere a:
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
Palabras clave: 
kbmt kbhowtomaster kbprovider KB318373 KbMtes
Traducción automática
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

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com