COMO: Recuperar metadados do Excel usando o método GetOleDbSchemaTable no Visual Basic .NET

Traduções deste artigo Traduções deste artigo
ID do artigo: 318373 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo passo a passo descreve como recuperar metadados de coluna e tabela de fontes de dados do Microsoft Excel usando o método GetOleDbSchemaTable com o provedor Microsoft OLE DB gerenciado e o Microsoft OLE DB Provider for Jet.

O método GetOleDbSchemaTable que é exposto pela classe System.Data.OLEDB do Microsoft .NET Framework é o sucessor do .NET para o método OpenSchema em versões anteriores do Microsoft ActiveX Data Objects (ADO).

Descrição da técnica

Após conectar-se a uma fonte de dados do Excel usando o ADO.NET, você extrair uma lista de tabela de metadados usando GetOleDbSchemaTable e usar o mesmo método com argumentos diferentes para obter metadados de coluna para a tabela selecionada. Você também pode usar um objeto DataGridTableStyle para definir o layout e formatar os resultados da consulta em uma grade de dados.

Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que será necessário:
  • O Visual Studio .NET instalado em um compatível com sistema operacional Microsoft Windows
  • Pelo menos um Microsoft Excel arquivo de pasta de trabalho (.xls) com algumas linhas e colunas de dados
Este artigo pressupõe que você tenha pelo menos básica familiaridade com os seguintes tópicos:
  • Visual Basic .NET
  • Acesso a dados ADO.NET
  • Pastas de trabalho do Excel e planilhas

Exemplo

  1. Inicie o Microsoft Visual Studio .NET e crie um novo projeto Visual Basic.NET Windows Application.
  2. Adicione três controles Button e dois controles DataGrid ao formulário padrão (Form1). Altere a propriedade texto dos controles de botão para Recuperar metadados , Lista de tabelas de formato e Formatar colunas lista respectivamente.
  3. Alterne para o módulo de código do formulário e adicione as seguintes instruções Imports na parte superior:
    Imports System.Data
    Imports System.Data.OleDb
    Imports System.ComponentModel
  4. Inserir as seguintes declarações de nível de módulo da classe de formulário após a linha "Inherits System.Windows.Forms.Form". Ajuste a seqüência de caracteres de conexão conforme necessário para apontar para um arquivo de pasta de trabalho do Excel que contém algumas linhas e colunas de dados.
        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. Inserir o código a seguir na classe formulário após a região "Windows Form Designer gerou código". Este código chama GetOleDbSchemaTable para carregar as listas de tabela e colunas, preenche os controles DataGrid e atualiza a lista de colunas quando altera a tabela selecionada.
        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. Insira o código a seguir para definir o layout e Formatar tabelas DataGrid usando TableStyles . Observe o uso de PropertyDescriptor para facilitar a formatação não padrão das colunas de data.
        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. Insira o código a seguir para definir o layout e formatar as colunas DataGrid usando 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. Execute o projeto.
  9. Clique em Recuperar metadados para preencher a lista de tabelas (DataGrid1) com todas as colunas de informações que são retornadas para cada tabela na pasta de trabalho da Excel por GetOleDbSchemaTable . A lista de colunas (DataGrid2) é preenchida ao mesmo tempo com todas as colunas de informações que são retornadas para as colunas da primeira tabela na lista tabelas .
  10. Selecione uma tabela diferente na lista tabelas . A lista de colunas é alterada para exibir as colunas da tabela selecionada do porque cm_PositionChanged manipulador de eventos que você implementou.
  11. Clique em Lista de tabelas de formato para definir e aplicar um TableMappingStyle DataGrid1. Isso torna os cabeçalhos de coluna mais "amigável" e exibe somente as quatro colunas de dados útil das nove colunas que são retornados pelo GetOleDbSchemaTable . Essas colunas são exibidas:
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    Essas colunas em branco não são exibidas:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    DESCRIÇÃO
    TABLE_PROPID
  12. Clique em Lista de colunas de formato para definir e aplicar um TableMappingStyle para DataGrid2. Isso torna os cabeçalhos de coluna mais "amigável" e exibe somente as mais úteis 5 colunas de dados das 28 colunas que são retornados pelo GetOleDbSchemaTable .
    NOME_COLUNA
    ORDINAL_POSITION
    DATA_TYPE
    MAXIMUM_CHARACTER_LENGTH
    NUMERIC_PRECISION
    Essas colunas principalmente em branco não são exibidas:
    TABLE_CATALOG
    TABLE_SCHEMA
    Table_name (já conhecida)
    COLUMN_GUID
    COLUMN_PROPID
    COLUMN_HASDEFAULT (sempre false)
    COLUMN_DEFAULT
    COLUMN_FLAGS
    IS_NULLABLE (sempre 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
    NOME_DO_DOMÍNIO
    DESCRIÇÃO
  13. Clique em uma linha diferente na DataGrid1 para selecionar uma tabela diferente. A lista de colunas é atualizada automaticamente. Os TableStyles aplicadas anteriormente a cada DataGrid permanecerão em vigor.

Solução de problemas

  • Os tipos de dados de coluna são retornados pelo GetOleDbSchemaTable para uma fonte de dados do Excel não são idênticos em todos os casos aos tipos de dados que são retornados pelo método OpenSchema no ADO Clássico:
    Recolher esta tabelaExpandir esta tabela
    Tipo de colunaADO ClássicoADO.NET (OLE DB)
    Numérico5 adDouble5 OleDbType.Double
    Moeda6 adCurrency6 OleDbType.Currency
    Data/horaadDate 7OleDbType.Date 7
    BooleanoadBoolean 11OleDbType.Boolean 11
    Texto < 255202 adVarWChar130 OleDbType.WChar
    Memorando203 adLongVarWChar130 OleDbType.WChar
  • GetOleDbSchemaTable , como OpenSchema , retorna uma única coluna "F1" de uma planilha do Excel vazia, embora na verdade não títulos de coluna ou dados estão presentes.

Referências

Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
257819COMO: Usar o ADO com dados do Excel do Visual Basic ou VBA

Propriedades

ID do artigo: 318373 - Última revisão: quarta-feira, 3 de setembro de 2003 - Revisão: 2.1
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbhowtomaster kbprovider KB318373 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 318373

Submeter comentários

 

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