none
OLEDB - conectar em excel e ler apenas os cabeçalhos de nomes (metadados) RRS feed

  • Pergunta

  • Boa noite

    Estou tentando ler o cabeçalho de campos(metadados) de excel, mas não estou conseguindo. Uso aspnet para fazer a conexão, mas o sql não flui. Tentei assim:

          OleDbConnection conn = new OleDbConnection();
          conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + caminho + ";Extended Properties='Excel 12.0;HDR=NO;IMEX=1';";
          conn5.Open();
    
          OleDbCommand cmd12 = new OleDbCommand("SELECT TOP 1 * FROM [Empresas$]", conn);
          OleDbDataReader dr5 = cmd12.ExecuteReader();
      
    


    Queria algo assim, como vi no my sql:

    SELECT table_schema, table_name, column_name FROM information_schema.columns WHERE table_schema != 'mysql' AND table_schema != 'information_schema'
    

    Se alguém puder ajudar valeu!

     

     

     


    Israel Homem
    • Movido Gustavo Maia Aguiar sexta-feira, 12 de agosto de 2011 12:07 (De:SQL Server - Desenvolvimento Geral)
    sexta-feira, 12 de agosto de 2011 04:27

Respostas

  • Opa Feranando eu fiz assim:

    Mudei o HDR=YES

    OleDbConnection conn5 = new OleDbConnection();
          conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + caminho + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1';";
          conn.Open();
    
          OleDbCommand cmd12 = new OleDbCommand("SELECT TOP 1 * FROM [Empresas$]", conn);
          OleDbDataReader dr = cmd12.ExecuteReader();
    
          int contar = dr.FieldCount;
          List<string> lista = new List<string>();
          
          for (int i = 0; i < contar; i++) 
          {
            string campo = dr.GetName(i).ToString();
            lista.Add(campo);
          }
    


    Israel Homem
    sexta-feira, 12 de agosto de 2011 13:21

Todas as Respostas

  • olá Israel,

    Acredito que o Excel não tenha uma tabela com os nomes das colunas...

    Para oq vc deseja fazer, existe a possibilidade de utilizar o Open XML SDK 2.0.

    É uma API da Microsoft que trabalha com código Open XML, formato dos arquivos do Office a partir da versão 2007.

     

    Segue o exemplo de como pegar o nome da planilha e o título das colunas...

    // Utilizar estes namespaces
    using DocumentFormat.OpenXml.Spreadsheet;
    using DocumentFormat.OpenXml.Packaging;
    using System.Text.RegularExpressions;
    
    private void ReadDocument()
    {
      string arquivo = @"C:\temp\teste.xlsx";
      using (SpreadsheetDocument excel = SpreadsheetDocument.Open(arquivo, true))
      {
        WorkbookPart workbookPart = excel.WorkbookPart;
    
        IEnumerable<Sheet> sheets = workbookPart.Workbook.Descendants<Sheet>();
        foreach (Sheet itemSheet in sheets)
        {
          WorksheetPart workPart = (WorksheetPart)workbookPart.GetPartById(itemSheet.Id);
    
          string planName = itemSheet.Name;
    
          IEnumerable<Cell> cells = workPart.Worksheet.Descendants<Cell>().Where(c => GetRowIndex(c.CellReference) == 1);
          foreach (Cell itemCell in cells)
          {
            string columnName = itemCell.CellValue.Text;
          }
        }
      }
    }
    
    private int GetRowIndex(string cellReference)
    {
      Regex regex = new Regex(@"\d+");
      Match match = regex.Match(cellReference);
      return Convert.ToInt32(match.Value);
    }
    

    Aqui vc faz o download do Open XML SDK 2
    http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5124

     

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    sexta-feira, 12 de agosto de 2011 12:56
    Moderador
  • Outro teste:

    OleDbConnection conn = new OleDbConnection();
    conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + arquivo + ";Extended Properties='Excel 12.0;HDR=NO;IMEX=1';";
         
    OleDbDataAdapter da = new OleDbDataAdapter("SELECT TOP 1 * FROM [Plan1$]", conn);
    DataSet ds = new DataSet();
    da.Fill(ds);
          
    foreach (DataColumn col in ds.Tables[0].Columns)
    {
      object nomeDaColuna = col;
    }
    

    Mas nesse caso, o nome da coluna não é o correto, e sim um ID que faz referência ao mesmo...


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    sexta-feira, 12 de agosto de 2011 13:13
    Moderador
  • Opa Feranando eu fiz assim:

    Mudei o HDR=YES

    OleDbConnection conn5 = new OleDbConnection();
          conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + caminho + ";Extended Properties='Excel 12.0;HDR=YES;IMEX=1';";
          conn.Open();
    
          OleDbCommand cmd12 = new OleDbCommand("SELECT TOP 1 * FROM [Empresas$]", conn);
          OleDbDataReader dr = cmd12.ExecuteReader();
    
          int contar = dr.FieldCount;
          List<string> lista = new List<string>();
          
          for (int i = 0; i < contar; i++) 
          {
            string campo = dr.GetName(i).ToString();
            lista.Add(campo);
          }
    


    Israel Homem
    sexta-feira, 12 de agosto de 2011 13:21