Você está offline; aguardando reconexão

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

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
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 318452.

NESTA TAREFA

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

back to the top

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.

back to the top

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
back to the top

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.DataImports System.Data.OleDbImports 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.
back to the top

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:
    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.
back to the top
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
back to the top

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 318373 - Última Revisão: 09/03/2003 22:57:40 - Revisão: 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 KbMtpt
Comentários
/html>