Artigo: 318452 - Última revisão: quarta-feira, 3 de Setembro de 2003 - Revisão: 2.2

COMO: Obter Meta dados do Excel utilizando GetOleDbSchemaTable no Visual C# .NET

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sumário

Utilize este guia passo-a-passo para obter metadados tabelas e colunas de uma origem de dados Microsoft Excel utilizando o método GetOleDbSchemaTable com o fornecedor Microsoft OLE DB geridos e o Microsoft OLE DB Provider for Jet.

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

Descrição da técnica

Depois de ligar a uma origem de dados do Excel utilizando o Microsoft ADO.NET, extrai uma lista de tabela meta dados utilizando o método GetOleDbSchemaTable . Em seguida, utilize o mesmo método com argumentos diferentes para obter metadados de coluna para a tabela seleccionada. Também pode utilizar o método DataGridTableStyle para esquematizar e formatar resultados da consulta na grelha de dados.

Requisitos

A lista seguinte descreve o hardware recomendado, software, infra-estrutura de rede e service packs que necessita:
  • Microsoft Visual Studio .NET instalado num sistema operativo Microsoft Windows compatível.
  • Pelo menos o Microsoft Excel livro ficheiro (.xls) com algumas linhas e colunas de dados.
Este artigo pressupõe que está familiarizado com os seguintes tópicos:
  • Microsoft Visual C# .NET.
  • Microsoft ADO.NET acesso a dados.
  • Folhas de cálculo e livros do Microsoft Excel.

Exemplo

  1. Inicie o Visual Studio .NET e crie um novo projecto de Visual C# Windows formulários de aplicação.
  2. Adicione dois controlos DataGrid e de três controlos botão ao Form1. Altere a propriedade texto dos controlos botão para designar os botões de Obter dados de Meta , Formato de lista de tabelas e de Formato de lista de colunas , respectivamente.
  3. Mude para o módulo de código para o formulário e adicionar as seguintes instruções antes de qualquer outro código:
    using System.ComponentModel;
    using System.Data;
    using System.Data.OleDb;
    					
  4. A classe de formulário , inserir as seguintes declarações de nível de módulo. Que a ligação, aponte para um ficheiro de livro do Excel que contém algumas linhas e colunas de dados de cadeia.
           private  OleDbConnection cn;
           private String strCn = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\\test.xls;Extended Properties=Excel 8.0";
           private DataTable dtTables;
           private CurrencyManager cm;
           private DataTable dtColumns;
           private DataView  dvColumns;
    					
  5. Da classe de formulário , após a secção de código Windows criador de formulários gerados, insira o seguinte código. Este código chama GetOleDbSchemaTable para carregar a tabela e coluna lista preenche DataGrids e actualiza a lista de colunas quando altera a tabela seleccionada.
    private void button1_Click(object sender, System.EventArgs e)
    {
            GetTablesList();	
    }
    private void GetTablesList()
    {
    	try
    	{
    	        cn = new OleDbConnection(strCn);
    		cn.Open();
    		dtTables = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]{null,null,null,"TABLE"});
    		dataGrid1.DataSource = dtTables;
    		dataGrid1.ReadOnly = true;
    		cn.Close();
    	}
    	catch(System.Data.OleDb.OleDbException myException)
    	{
    		for (int i=0; i < myException.Errors.Count; i++)
    		{
    			MessageBox.Show("Index #" + i + "\n" +
    			"Message: " + myException.Errors[i].Message + "\n" +
    			"Native: " +                          
    myException.Errors[i].NativeError.ToString() + "\n" +
    			"Source: " + myException.Errors[i].Source + "\n" +
    			"SQL: " + myException.Errors[i].SQLState + "\n");
    		}
    	}
                
    	GetColumnsList();
    }
    
    private void GetColumnsList()
    {	
    	if( cm == null)
    		cm = (CurrencyManager)this.BindingContext [dtTables];
                    
    	cm.PositionChanged += new EventHandler(this.cm_PositionChanged );
    			
    	int r = cm.Position;
    
            String strTable = dtTables.Rows[r]["TABLE_NAME"].ToString ();
            cn = new OleDbConnection(strCn);
    	cn.Open();
    	dtColumns = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,new Object[]{null,null, strTable, null});
            dvColumns = new DataView(dtColumns);
            dvColumns.Sort = "ORDINAL_POSITION";
            dataGrid2.DataSource = dvColumns;
    	dataGrid2.ReadOnly = true;
    	cn.Close();
    }
    		
    private void cm_PositionChanged( object sender, System.EventArgs e)
    {
    	GetColumnsList();
    }
    								
    					
  6. Insira o seguinte código para esquematizar e formatar tabelas DataGrid utilizando TableStyles . Tenha em atenção a utilização de PropertyDescriptor para facilitar a formatação não predefinida das colunas data.
    private void button2_Click(object sender, System.EventArgs e)
    {
    	FormatTablesGrid(dtTables);
    }
    
    private void FormatTablesGrid(DataTable dt2format)
    {
    	DataGridTableStyle gs = new DataGridTableStyle();
            gs.MappingName = dt2format.TableName;
                
    	DataGridColumnStyle cs = new DataGridTextBoxColumn();
                
    	cs.MappingName = "TABLE_NAME";
    	cs.HeaderText = "Table Name";
    	cs.Width = 75;
    		
    	gs.GridColumnStyles.Add(cs);
    			
    	cs = new DataGridTextBoxColumn();
    	cs.MappingName = "TABLE_TYPE";
    	cs.HeaderText = "Table Type";
    	cs.Width = 75;
    		
    	gs.GridColumnStyles.Add(cs);
    
    	CurrencyManager cm = (CurrencyManager)this.BindingContext[dt2format];
    			
    	PropertyDescriptor pd = cm.GetItemProperties()["DATE_CREATED"];
    	
    	cs = new DataGridTextBoxColumn(pd, "d");
            cs.MappingName = "DATE_CREATED";
    	cs.HeaderText = "Date Created";
            cs.Width = 75;
    			
    	gs.GridColumnStyles.Add(cs);
    
    	cm = ( CurrencyManager)this.BindingContext[dt2format];
    	pd = cm.GetItemProperties()["DATE_MODIFIED"];
    
    	cs = new DataGridTextBoxColumn(pd, "d");
            cs.MappingName = "DATE_MODIFIED";
            cs.HeaderText = "Date Modified";
            cs.Width = 75;
    			
    	gs.GridColumnStyles.Add(cs);
    
    	dataGrid1.TableStyles.Add(gs);
    	button2.Enabled = false;
    
    }
    					
  7. Insira o seguinte código para esquematizar e formatar as colunas DataGrid utilizando TableStyle :
            private void button3_Click(object sender, System.EventArgs e)
    	{
    		FormatColumnsGrid(dtTables);
    	}
    		
    		
            private void FormatColumnsGrid(DataTable dt2format)
    	{
    	    DataGridTableStyle gs = new DataGridTableStyle();
                gs.MappingName = dtColumns.TableName;
                
    	    DataGridColumnStyle cs = new DataGridTextBoxColumn();
                cs.MappingName = "COLUMN_NAME";
                cs.HeaderText = "Column Name";
                cs.Width = 100;
    
    	    gs.GridColumnStyles.Add(cs);
    
    	    cs = new DataGridTextBoxColumn();
                cs.MappingName = "ORDINAL_POSITION";
                cs.HeaderText = "Ordinal Position";
                cs.Width = 100;
    
    			gs.GridColumnStyles.Add(cs);
    
                cs = new DataGridTextBoxColumn();
                cs.MappingName = "DATA_TYPE";
    	    cs.HeaderText = "Data Type";
    	    cs.Width = 75;
    
    	    gs.GridColumnStyles.Add(cs);
    
                cs = new DataGridTextBoxColumn();
                cs.MappingName = "CHARACTER_MAXIMUM_LENGTH";
                cs.HeaderText = "Text Length";
    	    cs.Width = 75;
    
    	    gs.GridColumnStyles.Add(cs);
    
                cs = new DataGridTextBoxColumn();
                cs.MappingName = "NUMERIC_PRECISION";
                cs.HeaderText = "Numeric Precision";
    	    cs.Width = 75;
    
    	    gs.GridColumnStyles.Add(cs);
                dataGrid2.TableStyles.Add(gs);
    
                button3.Enabled = false;
    
    	}
    					
  8. Execute o projecto.
  9. Clique em obter dados Meta (Button1).

    A lista de tabelas (DataGrid1) é preenchida com todas as colunas de informações devolvidas para cada tabela no livro do Excel pelo método GetOleDbSchemaTable . Copia a lista de colunas (DataGrid2) ao mesmo tempo com todas as colunas de informações devolvidas para as colunas da primeira tabela na lista tabelas .
  10. Na lista de tabelas , seleccione uma tabela diferente.

    A lista de colunas mostra as colunas da tabela seleccionada como resultado de processador de eventos cm_PositionChanged .
  11. Clique em formato de lista de tabelas (Button2). Isto define e aplica um TableMappingStyle para DataGrid1, efectuar os cabeçalhos das colunas mais amigáveis e apresentar apenas as quatro colunas de dados útil
    TABLE_NAME
    TABLE_TYPE
    DATE_CREATED
    DATE_MODIFIED
    em vez das nove colunas devolvidas pelo método GetOleDbSchemaTable .

    As colunas em branco que não são apresentadas são:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_GUID
    DESCRIÇÃO
    TABLE_PROPID
  12. Clique em formato de lista de colunas (Button3). Isto define e aplica um TableMappingStyle para DataGrid2, efectuar os cabeçalhos das colunas mais amigáveis e apresentar apenas as cinco mais úteis colunas de dados COLUMN_NAME ORDINAL_POSITION DATA_TYPE MAXIMUM_CHARACTER_LENGTH NUMERIC_PRECISION das 28 colunas devolvido pelo método GetOleDbSchemaTable .

    As colunas que não são apresentadas são:

    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_DOMÍNIO
    DESCRIÇÃO
  13. Clique numa linha diferente na DataGrid1 para seleccionar uma tabela diferente. A lista de colunas é actualizada automaticamente. TableStyles anteriormente aplicada a cada DataGrid permanecem em vigor.

Resolução de problemas

  • Os tipos de dados de coluna devolvidos pelo método GetOleDbSchemaTable para uma origem de dados do Excel não são iguais em todos os incidentes para os tipos de dados devolvidos pelo método OpenSchema em versões anteriores do ADO:
    Reduzir esta tabelaExpandir esta tabela
    Tipo de colunaADO clássicoADO.NET (OleDb)
    Numérico5 adDouble5 OleDbType.Double
    MoedaadCurrency 6OleDbType.Currency 6
    Data/horaadDate 7OleDbType.Date 7
    Valor boleano11 adBoolean11 OleDbType.Boolean
    Texto < 255202 adVarWChar130 OleDbType.WChar
    Nota203 adLongVarWChar130 OleDbType.WChar

  • GetOleDbSchemaTable , semelhante ao OpenSchema , devolve uma única coluna ("F1") de uma folha de cálculo vazia do Excel quando, na realidade, não cabeçalhos de coluna ou dados existem.

Referências

Para obter informações adicionais, clique no número de artigo existente abaixo para visualizar o artigo na base de dados de conhecimento da Microsoft:
257819  (http://support.microsoft.com/kb/257819/EN-US/ ) COMO: Utilizar o ADO com dados do Excel a partir do Visual Basic ou VBA

A informação contida neste artigo aplica-se a:
  • Microsoft ADO.NET 1.1
  • Microsoft ADO.NET 1.0
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
Palavras-chave: 
kbmt kbhowtomaster KB318452 KbMtpt
Tradução automáticaTraduçã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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 318452  (http://support.microsoft.com/kb/318452/en-us/ )