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
- Inicie o Microsoft Visual Studio .NET e crie um novo projeto Visual Basic.NET Windows Application.
- 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.
- 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
- 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 - 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 - 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 - 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 - Execute o projeto.
- 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 .
- 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.
- 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
- 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
- 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 coluna | ADO Clássico | ADO.NET (OLE DB) |
|---|
| Numérico | 5 adDouble | 5 OleDbType.Double |
| Moeda | 6 adCurrency | 6 OleDbType.Currency |
| Data/hora | adDate 7 | OleDbType.Date 7 |
| Booleano | adBoolean 11 | OleDbType.Boolean 11 |
| Texto < 255 | 202 adVarWChar | 130 OleDbType.WChar |
| Memorando | 203 adLongVarWChar | 130 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.
Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
257819
(http://support.microsoft.com/kb/257819/EN-US/
)
COMO: Usar o ADO com dados do Excel do Visual Basic ou VBA