sábado, 13 de abril de 2019

Windows Forms - Trabalhando com arquivos do Excel



No artigo deste mês irei abordar um assunto muito comum no nosso suporte técnico, o uso de arquivos do Microsoft Excel junto com Windows Forms. Demonstrarei como devemos realizar a integração da biblioteca “System.Data.OleDb”, presente na plataforma .NET e responsável pela implementação de rotinas de inserção e atualização de dados em arquivos do tipo “xls” ou “xlsx”, tendo como base a linguagem C#.
Importante: Para este exemplo terei como base o uso do Microsoft Excel 2013

Conhecendo o Namespace “System.data.OleDb”

Este “Namespace” representa uma coleção de classes usadas para acessar uma fonte de dados do tipo OLE DB, ou seja, a mesma possui métodos específicos que irão nos auxiliar e facilitar o uso de nossa fonte de dados específica (arquivos “xls” ou “xlsx”).
Iremos descrever as principais classes e métodos presentes neste Namespace, sendo:
Classe OleDbConnection: Representa uma conexão com uma fonte de dados. O método “Open()” é reponsável por abrir uma conexão de banco de dados com as configurações de propriedades especificadas pela string de conexão. Já o “Close()” finaliza a conexão com a fonte de dados.
Classe OleDbCommand: Representa uma instrução SQL ou procedimento armazenado a executar em uma fonte de dados. Possuímos o método “Parameters.AddWithValue()”, o qual receberá os parâmetros indicados em uma instrução SQL.
Exemplo: Parameters.AddWithValue(“@descricao”, “the club”)
Sendo:“@descricao” significa o nome e “the club” o valor do parâmetro.
Para executar a instrução SQL e retornar um número de linhas afetadas podemos utilizar o método “ExecuteNonquery()”.

Criando o Exemplo

Antes de partirmos para a implementação do nosso exemplo, será necessário criar um pequeno arquivo “XLSX” contendo: Id, Nome, Contato e Documento. Ver Figura 01.

Figura 01: Estrutura do Arquivo XLSX.

Com o Microsoft Visual Studio iniciado crie uma solução do tipo “Windows Forms” contendo um formulário com os mesmos tipos de campos descritos anteriormente. Aproveite também para adicionar um botão para Inserir dados e outro para atualizá-los. Através da Figura 02 podemos ter uma noção de como deverá ficar esta tela.


Figura 02: Formulário de Exemplo.


Codificando o Exemplo

Usaremos os seguintes Namespaces:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;
Para organizarmos nosso código achei de extrema importância criar alguns métodos específicos, sendo: o “LimparDados()” como o próprio nome já diz, será responsável por limpar os dados contidos em todos os “TextBoxes” (Listagem 01) após a inserção ou atualização e o “ConexaoXlsx()”, contendo a String de conexão junto com o caminho do arquivo “xlsx”. (Listagem 02)

private void LimparDados()
{
    txtId.Clear();
    txtNome.Clear();
    txtDocumento.Clear();
    txtContato.Clear();
 }
Listagem 01.

Para obtermos o caminho do “.exe” automaticamente usaremos o método “Path.GetDirectoryName” passando “Application.ExecutanlePath” como parâmetro. Após esta etapa concatenaremos com o nome do arquivo do tipo “xlsx” (exemplo.xlsx). A String de conexão é específica para arquivos desde a versão 2010 do Microsoft Excel, ou seja, será obrigatório incluir o “Provider”, o “Data Source” e o “Extended Properties”, conforme indicado no código abaixo.

private
string ConexaoXlsx()
{
string Caminho = Path.GetDirectoryName(Application.ExecutablePath);
   string ArquivoXlsx = Caminho + "\\exemplo.xlsx";

return "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + ArquivoXlsx + "';Extended Properties=Excel 12.0;";
}
Listagem 02.

No evento “Click” do botão inserir instanciaremos a classe “OleDbConnection” passando no construtor o procedimento “ConexaoXlsx”. Criaremos uma variável do tipo texto para nossa instrução de “INSERT”.
Usaremos o nome contido na aba do Excel (Exemplo: [Folha1$] ), seguido de “$”. Para a criação dos comandos instanciaremos a classe “OleDbCommand” usando as variáveis “Sql” e “Conexao”. Logo em seguida adicionaremos os parâmetros (id, nome, contato, documento) através do método “Parameters.AddWithValue”, abriremos a conexão através do método “Open()” e por final com o auxílio de um bloco “try/catch” executamos o “Insert”.
Ver Listagem 03.
 
private
void btnInserir_Click(object sender, EventArgs e)
{           
using (OleDbConnection Conexao = new OleDbConnection(ConexaoXlsx()))
     {
string Sql = "INSERT INTO [Folha1$] (id, nome, contato, documento) VALUES (@id, @nome, @contato, @documento)";
               
OleDbCommand Comandos = new OleDbCommand(Sql, Conexao);
               
Comandos.Parameters.AddWithValue("@id", txtId.Text);
Comandos.Parameters.AddWithValue("@nome", txtNome.Text);
Comandos.Parameters.AddWithValue("@contato", txtContato.Text);
Comandos.Parameters.AddWithValue("@documento", txtDocumento.Text);

     Conexao.Open();

          try
          {
Comandos.ExecuteNonQuery();
MessageBox.Show("Dados Inseridos com Sucesso!");
               LimparDados();
          }
          catch
          {
MessageBox.Show("Ocorreu um erro ao Inserir os Dados!");
          }
      Conexao.Close();
     }
}
Listagem 03.

O botão “Atualizar Dados” irá executar uma instrução de “UPDATE” no arquivo “xlsx”. Teremos o código idêntico ao que foi explicado anteriormente. Ver Listagem 04.

private void btnAtualizar_Click(object sender, EventArgs e)
{        
using (OleDbConnection Conexao = new OleDbConnection(ConexaoXlsx()))
     {
string strSQL = "UPDATE [Folha1$] SET nome = @nome, contato = @contato, documento = @documento WHERE id = '"+txtId.Text+"'";
               
OleDbCommand Comandos = new OleDbCommand(strSQL, Conexao);
                    Comandos.Parameters.AddWithValue("@nome", txtNome.Text);
Comandos.Parameters.AddWithValue("@contato", txtContato.Text);
Comandos.Parameters.AddWithValue("@documento", txtDocumento.Text);

Conexao.Open();
          try
          {
               Comandos.ExecuteNonQuery();
MessageBox.Show("Dados Atualizados com Sucesso!");
               LimparDados();
          }
          catch
          {
MessageBox.Show("Ocorreu um erro ao Atualizar os Dados!");
          }

      Conexao.Close();
     }
}
Listagem 04.

Ao compilar e executar a aplicação teremos um resultado parecido com o da Figura 03.

Figura 03: Exemplo de Inserção.

O mesmo resultado poderá ser conferido utilizando o botão “Atualizar Dados”.
Ao realizar algumas inserções ou atualizações, teremos uma planilha alimentada com alguns registros. Ver Imagem 04.

Figura 04: Exemplo.

Conclusões

Procurei neste artigo explorar algumas funcionalidades da biblioteca “System.Data.OleDb” presente na plataforma .NET. Uma das características destra biblioteca seria a integração com planilhas do Microsoft Excel, o qual foi abordado minuciosamente neste mês com um exemplo prático.
Desejo a todos uma ótima leitura, um abraço e até o mês que vem!

Referências

https://msdn.microsoft.com/pt-br/library/system.data.oledb.oledbconnection(v=vs.110).aspx



Nenhum comentário:

Postar um comentário