O post de hoje é algo que muitos desenvolvedores não fazem nem idéia que é possível: conectar e utilizar planilhas Excel como se fosse um banco de dados, e não estou falando de CSV. Sim, isso mesmo, ao invés de ficar armazenando em flat-files (os populares TXT com marcações) você pode utilizar o Excel para trabalhar como se fosse um autêntico banco de dados…Ok, eu é que não vou ficar fazendo apologia ao uso de Excel ao invés de um SGBD de verdade. O real intuito deste post é ensinar como consumir os dados existentes em uma planilha de terceiros. Muitas vezes há a necessidade de utilizar dados de planilhas legadas para importar em sua base de verdade, ou então você pode precisar desenvolver um sistema que agregue dados de planilhas diferentes em um único banco e por aí vai.
A Conexão
Obviamente, o primeiro passo é se conectar na dita planilha. E é aqui onde a maioria dos desenvolvedores se quebra pois esta etapa possui algumas particuliaridades. Em primeiro lugar, como toda conexão com base de dados você precisará utilizar classes do ADO.NET, o framework de acesso a dados da plataforma .NET. No caso do Excel, a melhor opção é utilizarmos uma conexão OLE DB. Para quem não sabe, OLE DB (Object Linking and Embedding DataBase) é uma API desenvolvida pela Microsoft para acesso a dados de forma nativa no Windows, via COM. Pois bem, através de OLE DB, podemos acessar dados em Access e Excel. Quando o assunto é Access, a melhor alternativa é utilizar ODBC, mas com Excel, OLEDB é uma boa opção. Como de praxe, você precisará importar a biblioteca System.Data e instanciar um OleDbConnection conforme mostrado abaixo:
1 2 3 4 5 |
using System.Data; var _conexao = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=planilha.xls;Extended Properties='Excel 8.0;HDR=YES;'"); _conexao.Open(); |
A string de conexão determina o provedor a ser utilizado na conexão (no meu exemplo, a API OLE DB versão 4.0, nativa do Windows), a fonte dos dados (basicamente o caminho completo até a planilha, no meu exemplo, ela se encontra na mesma pasta do programa) e algumas propriedades específicas da conexão, como a versão do Excel a (8.0) e se a planilha possui cabeçalho (HDR = Header = Cabeçalho). A string de conexão OLE DB é muito sensível, então muita atenção à sua escrita, erros comuns incluem escrever ‘DataSource’ ao invés de ‘Data Source’, ou então usar uma versão de Excel errada. Outro erro muito comum é colocar a propriedade de cabeçalho fora da string ‘Extended Properties’ (note que a versão do Excel e a informaçãod e cabeçalhos existentes estão entre aspas). Qualquer erro em sua string de conexão irá gerar o erro “Não foi possível encontrar ISAM instalável.” que é algo extremamente genérico e sem muita utilidade.
A Consulta
Uma vez que a consulta foi instanciada, agora podemos executar comandos sobre a planilha à qual nos conectamos. Você já deve ter utilizado mais de uma planilha em uma mesma pasta do Excel, não é mesmo? E como você fazia para se organizar? Colocava nomes nas planilhas, certo? É isso mesmo! Imagine a sua pasta do Excel como seu “banco de dados” e cada planilha dentro da pasta como suas “tabelas”. E como você faria uma consulta no SQL Server sobre uma tabela do seu banco? ‘SELECT * FROM Tabela’? E é isso mesmo que você vai fazer! Dê uma olhada no código abaixo, onde usamos o OleDbCommand para realizar consultas no banco:
1 2 3 4 5 |
var cmd = new OleDbCommand("SELECT * FROM [tabela$]", _conexao); var dt = new DataTable(); dt.Load(cmd.ExecuteReader()); |
O código acima é auto-explicativo, é simplesmente a instanciação de um OleDbCommand passando um comando pseudo-SQL (na verdade o nome disso é MS Query) e a conexão instanciada no passo anterior. As linhas seguintes já são corriqueiras a todo programador que já tenha utilizado ADO.NET para se conectar a um banco de dados, a consulta é executada retornando um DataReader, que por sua vez é carregado em um DataTable, para posterior utilização. Preste apenas atenção no fato de que a “tabela” do Excel é delimitada entre colchetes e SEMPRE deve terminar com um cifrão. Não me pergunte o porquê, eu realmente não sei, hehehehe.
Espero que este post seja útil!
Olá, tudo bem?
O que você achou deste conteúdo? Conte nos comentários.
Amigo obrigado pelo exemplo!!! Mas estou tendo um problema com minha planilha…. q é bem simples.. ela possui valores numéricos (q foram puxados via dde de uma plataforma de cotação de dolar). Ao preencher o grid, os valores ficaram assim > f1 f2 f3 (até f11) e a 12 coluna veio com o valor correto (no caso 3185,00) rs… sabe o q pode ser? Obrigado
Boa tarde Ricardo, ao que parece sua planilha é dinâmica, os exemplos que precisei usar na época deste post eram com planilhas estáticas. Tenta trocar as fórmulas por valores estáticos, de repente funciona.
Opa maravilha… vou fazer um macro pra copiar os valores dinamicos gerando valores fixos ( n posso abrir mão do dinamico ali, pois de fato é dinamico rs)
Vou testar aqui
obrigado!!!