Lendo um arquivo Excel via ADO.NET (C#, VB...) e importando-o para um DataTable
Leonel Fraga de Oliveira 31/01/2009 00:00
Microsoft Excel

Muitas vezes os sistemas necessitam que dados sejam atualizados por uma planilha do Excel.

Isto acontece porque a visualização e a edição de dados neste programa (e semelhantes) é mais produtiva para o usuário do que pelo nosso sistema. E quando muitos dados precisam ser inseridos ou atualizados, a produtividade com certeza é muito maior mesmo.

Então, nada mais lógico do que implementar uma funcionalidade para importar dados desta fonte para os nossos sistemas!

Criaremos um método em .NET (usarei o C# para demonstrar) que lê uma planilha Excel e importa seus dados em um DataTable, estrutura a qual já estamos bastante familiarizados, e a partir dele, podemos atualizar nosso banco de dados.

Acompanhe o código deste método:

/// 
/// Importa os dados de uma planilha Excel para um datatable
/// 
///Caminho do arquivo xls
///Nome da planilha a ser importada.
/// 
protected DataTable ExcelPlan2DataTable(string pWorksheetPath, string pPlanName)
{
    string cnnString = String.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;""", pWorksheetPath);
    string isql = "select * from [{0}$]";
    System.Data.OleDb.OleDbConnection cnn = new System.Data.OleDb.OleDbConnection(cnnString);
    System.Data.OleDb.OleDbDataAdapter da = new System.Data.OleDb.OleDbDataAdapter(String.Format(isql, pPlanName), cnn);
    DataSet ds = new DataSet();
    DataTable dt = new DataTable();
    try
    {
        cnn.Open();
        da.Fill(ds);
        dt = ds.Tables[0];
    }
    finally
    {
        cnn.Close();
        cnn.Dispose();
        da.Dispose();
        ds.Dispose();
    }
    return dt;
}
Como você pode ver, a coisa é bem mais simples do que parece, o segredo mesmo está na string de conexão utilizada:
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;"""
Ela utiliza o driver OLEDB do Microsoft Excel versão 8 (podem ser lidas planilhas até a versão 2003 - formato XLS -, o 2007 usa outro formato, o XLSX - OO XML), onde o parâmetro Data Source é o path completo da planilha a ser lida. Esta planilha NÃO deve estar aberta quando fomos requisitar ela; a mesma coisa ocorre quando esta planilha está aberta em nossa aplicação, o Windows Explorer dá uma "travada" quando vamos ver este arquivo.

Com a string de conexão, criamos os objetos do ADO.NET Connection e DataAdapter (do namespace System.Data.OleDb) da mesma forma como fazemos com um banco de dados qualquer.

No construtor do DataAdapter passamos dois parâmetros (na sobrecarga que estamos utilizando): o primeiro é a instrução SQL de Select, e o segundo é o objeto Connection.

Nesta instrução SQL para obter os dados, o nome da tabela na cláusula FROM será o nome de uma planilha da pasta de trabalho (um arquivo XLS, que é uma pasta de trabalho, pode ter N planilhas dentro dele), e o mesmo deve ser acrescido de cifrão ($) no final, e estar entre colchetes. Supondo que você queira pegar os dados da planilha PLAN1, seu nome deve estar escrito assim na cláusula FROM: [PLAN1$].

Depos disso, criamos um DataSet, e através do DataAdapter preenchemos este DataSet com o método Fill.

Com isso, será criada uma tabela no DataSet com os dados da planilha, e enfim, o retorno do método será esta tabela. No código acima, eu criei um objeto DataTable para pegar esta tabela e retornar.

Simples demais, não é? Veremos mais para frente como inserir e atualizar dados, e até criar novas planilhas via ADO.NET. E também fazer uma aplicação ASP.NET para importar e exportar planilhas. Mas já vou adiantando: trabalhe IGUAL como trabalha com um banco de dados! Simples assim mesmo. As únicas coisas que mudaram foram a string de conexão e a maneira como escrevemos o nome da tabela ;-)

PS: Quando procurei por esta solução quando eu estava precisando, achei ela em primeiro lugar neste site, do David Hayden. Um outro adendo interessante, é que antes já fiz coisa igual no Delphi, utilizando o driver ODBC na string de conexão e os componentes da palheta ADO (ADOConnection, ADOQuery, etc). O mesmíssimo processo, a mesma forma de fazer o Select...

Leonel Fraga de Oliveira Leonel Fraga de Oliveira é formado em Processamento de Dados na Faculdade de Tecnologia de São Paulo (FATEC-SP - 2002) e anteriormente em Técnico em Eletrônica, pela ETE Professor Aprígio Gonzaga (lá em 1999).
Atualmente trabalha como Analista de Sistemas na Prefeitura Municipal de São Caetano do Sul - SP
Tem como hobbies DJing (também trabalha como DJ freelancer) e ciclismo, além da manutenção dos sites NeoMatrix Light e NeoMatrix Tech.
Gosta de música eletrônica, tecnologia, cinema (super fã de Jornada nas Estrelas), gastronomia e outras coisas mais.


Compartilhe nas redes sociais

   

Deixe seu comentário

comments powered by Disqus