Extrair dados de ficheiros Excel

Por vezes determinadas soluções informáticas requerem um maior investimento financeiro do que se espera necessário para a execução de uma determinada tarefa. Contudo, no futuro, tais situações são passíveis de mudança e um investimento do género poderá ser compensatório.

No quadro deste tipo de investimentos encontram-se as ferramentas afins ao Microsoft Office e mais particularmente o Excel. Este programa informático substitui os motores de bases de dados quando lidamos com quantidades reduzidas de iformação, disponibilizando um conjunto de funções simples que permitem operar sobre essa informação. Quando o volume de informação cresce acima de um determinado valor, ou é requerido o acesso a diversos utilizadores desempenhando diferentes papeis, uma solução do género deixa de ser exequível. Neste caso torna-se premente migrar toda essa informação para um sistema de gestão de bases de dados.

Por vezes é necessário realizar algumas operações de inteligência sobre a informação armazenada neste tipo de ficheiros, isto é, aplicar funções que, dado o seu grau de complexidade, não estão incluídas no produto.

Se recorrermos à linguagem de programação “Java” contamos com a livraria POI implementada também em C# com a designação de NPOI para aceder aos ficheiros de Excel. Outra alternativa, mais orientada para as linguagens C++ e C# consiste no recurso aos objectos COM do Excel Interop. Uma terceira possibilidade encontra-se na tecnologia OLEDB, a qual consiste numa interface que permite o acesso uniformizado a uma variada série de provedores de dados. Talvez seja esta última abordagem mais orientada para a migração entre ficheiros de Excel e bases de dados em SQLServer, à qual será aqui dada especial atenção.

A teconologia OLEDB permite elaborar consultas a tabelas de Excel com o auxílio de queries de SQL. Para o efeito, como é habitual em qualquer motor de base de dados, começa-se por obter uma conexão à fonte de dados. Neste nosso caso a conexão obtém-se do seguinte modo (os exemplos serão proporcionados em C#):

 

string connectionString = "provider=Microsoft.Jet.OLEDB.4.0;data source="

                + "pathcliente.xls" + ";Extended Properties=Excel 8.0;";

using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connectionString))

            {

                conn.Open();

                  //TODO: create your command here

    conn.Close();

            }

Utilizamos, neste caso, a directive using, uma vez que o modelo COM ainda não é gerido pelo garbage collector do .NET Framework, sendo necessária a sua remoção manual. Na string de conexão indicamos o provider e o source, o qual consite no caminho do ficheiro a partir do qual queremos extrair a informação. Neste ponto, temos acesso à interface habitual na comunicação com um motor de base de dados. Depois de abrir a conexão, criamos um comando com a query que pretendemos:

 

using (System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand("select * from [sheet1$A32:BB50]"))

                {

                    command.Connection = conn;

                    //TODO: create your data reader here

    }

Mais uma vez a directiva using é utilizada para forçar a eliminação manual do objecto do tipo OleDbCommand. Convém analizar brevemente o significado da query "select * from [sheet1$A32:BB50]". Como pode ser observado, tal consulta permite seleccionar todos os campos da tabela existente na sheet1 (o nome da sheet na query é sufixado com o carácter ‘$’. A ausência deste carácter torna a query inválida. Deste modo, se queremos uma query de toda a sheet, usamos a sintaxe "select * from [sheet1$]". Facilmente constatamos que a consulta anterior permite fazer uma selecção de todas as colunas existentes no Excel Range entre as células A32 e BB50.

A primeira linha lida contém o nome dos campos, caso sejam nomes válidos. Caso contrário um nome predifinido é atribuído. A melhor forma de perceber o seu funcionamento consiste precisamente em elaborar alguns testes em diferentes ficheiros.

Por fim, cria-se um DataReader para fazer um ciclo sobre os dados retornados:

using (System.Data.OleDb.OleDbDataReader reader = command.ExecuteReader())

{

while (reader.Read())

{

int index = 0;

Type readedType = reader.GetFieldType(index);

if (readedType == typeof(int) || readedType == typeof(Int32) )

{

                                richResults.AppendText(reader.GetInt32(index).ToString());

}

else if (readedType == typeof(double) || readedType == typeof(Double))

{

                                richResults.AppendText(reader.GetDouble(index).ToString());

}

else if (readedType == typeof(string) /*|| readedType == typeof(String)*/)

{

                                richResults.AppendText(reader.GetValue(index).ToString());

}

else

{

richResults.AppendText("Unknown");

}

}

Esta porção de código permite criar um reader, a partir do qual obtemos todos os valores da primeira coluna (cujo índice é 0). O reader devolve valores correctos enquanto forem do mesmo tipo, isto é, se o primeiro valor do campo for numérico, o reader retorna os respectivos valores caso estes sejam numéricos. Se encontrar alguma célula na coluna do tipo texto, irá retornar um nulo nesse ponto. É conveniente termos esse pequeno pormenor em conta.

Foram aqui descritos os passos essenciais a seguir para ler um ficheiro de Excel com o recurso a OLEDB. É pertinente fazer uma série de experiências para interiorizar completamente o seu funcionamento em termos dos nomes atribuídos aos campos e ao respectivo comportamento quando, na mesma coluna, estejam colocados dados de tipos diferentes.

 

Sobre Sérgio O. Marques

Licenciado em Física/Matemática Aplicada (Astronomia) pela Faculdade de Ciências da Universidade do Porto e Mestre em Matemática Aplicada pela mesma instituição, desenvolvo trabalho no PTC (Porto Technical Centre) - Yazaki como Administrador de bases-de-dados. Dentro o meu leque de interesses encontram-se todos os temas afins às disciplinas de Matemática, Física e Astronomia. Porém, como entusiasta, interesso-me por temas relacionados com electrónica, poesia, música e fotografia.
Esta entrada foi publicada em Computadores e Internet. ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s