C# - Lendo, Incluindo e Atualizado dados de uma planilha Excel
Hoje vamos ler, incluir e atualizar dados de uma planilha Excel 2007.
A partir da versão 2007 houve alterações na forma de acessar um banco de dados MS Access com os aplicativos Office.
A primeira coisa que você deve fazer é baixar e instalar o novo provedor de acesso a dados que deverá ser usado no lugar do Jet a partir deste link: 2007 Office System Driver: Data Connectivity Components
Nas versões anteriores utilizava-se o Microsoft Jet e a string de conexão usada pode ser vista no trecho de código abaixo:
Set conn = New ADODB.Connection With conn .Provider = "Microsoft.JET.OLEDB.4.0" .ConnectionString = "Data Source=" & caminhoArquivoDados; .Open End With |
Na versão 2007 o mesmo trecho de código, agora usando o novo provedor, ficaria assim :
Set conn = New ADODB.Connection With conn .Provider = "Provider=Microsoft.ACE.OLEDB.12.0" .ConnectionString = "Data Source=" & caminhoArquivoDados; .Open End With |
Além destas houve outras alterações como:
- Para abrir um arquivo Excel com linha de cabeçalho: Data Source =c:\ExcelArq.xlsx;HDR=yes;Format=xlsx;
- Para abrir um arquivo Excel sem linha de cabeçalho: Data Source =c:\ExcelArq.xlsx;HDR=no;Format=xlsx;
Quanto aos tipos de arquivos Excel 2007 temos as seguintes definições:
O arquivo excel pode ser tratado como texto definindo o flag: IMEX=1 na final da string de conexão:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\dados\Excel2007Arq.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";
Enfim, a mudança não foi tão grande assim...
Lendo, Incluindo e Atualizando dados de uma planilha Excel 2007
Nosso objetivo será atualizar os dados de uma planilha Excel 2007.
Pode ser qualquer planilha e eu vou usar uma planilha bem simples chamada Empregados.xlsx que pode ser vista na figura abaixo. Portanto você deve criar uma pasta de trabalho com o nome Empregados.xlsx e criar a planilha que contém o código e o nome de funcionários:
A pasta de trabalho Empregados.xlsx vai ser colocada na pasta c:\dados\Excel (mas você pode colocar em qualquer lugar bastando ajustar a variável que contém o caminho do arquivo)
Atualizar a planilha diretamente no Excel é muito simples o que desejamos e criar uma aplicação usando a linguagem C#.
Para isso eu vou usar os conceitos de conexão e acesso a planilha introduzidos no início deste artigo.
Vamos criar uma nova aplicação no Visual C# 2010 Express Edition do tipo Windows Forms Applicaton e dar a ela o nome de Excel;
A seguir vamos incluir no formulário form1.cs do projeto os seguintes controles:
O leiaute do formulário deverá estar conforme a figura abaixo:
Vamos definir no início do formulário form1.cs os seguintes namespaces:
using
System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;
A seguir defina as variáveis para conexão ,comando e a string de conexão e consulta:
private OleDbConnection
_olecon;
private OleDbCommand _oleCmd;
private static String _Arquivo = @"C:\dados\Excel\Empregados.xlsx";
private String _StringConexao = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data
Source={0};Extended Properties='Excel 12.0
Xml;HDR=YES;ReadOnly=False';", _Arquivo);
private String _Consulta;
Definindo o código dos eventos dos controles do formulário
No evento Load do formulário Excel defina o código
private void FormExcel_Load(object sender, EventArgs e) { try { _olecon = new OleDbConnection(_StringConexao); _olecon.Open(); _oleCmd = new OleDbCommand(); _oleCmd.Connection = _olecon; _oleCmd.CommandType = CommandType.Text; } catch (Exception ex) { MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } |
No evento Click do botão btnProcurar inclua o código abaixo:
private void btnProcurar_Click(object sender, EventArgs e) { try { _oleCmd.CommandText = "SELECT CodFunci, NomeFunci FROM [Empregados$] Where CodFunci = " + txtCodigoFunci.Text; OleDbDataReader reader = _oleCmd.ExecuteReader(); while (reader.Read()) { txtCodigoFunci.Text = reader.GetValue(0).ToString(); txtNomeFunci.Text = reader.GetString(1); } reader.Close(); } catch (Exception ex) { MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } |
No evento Click do botão Novo inclua o código a seguir:
private void btnNovo_Click(object sender, EventArgs e) { _Consulta = "INSERT INTO [Empregados$] "; _Consulta += "([CodFunci],[NomeFunci]) "; _Consulta += "VALUES "; _Consulta += "(@CodFunci,@NomeFunci)"; _oleCmd.CommandText = _Consulta; _oleCmd.Parameters.Add("@CodFunci", OleDbType.Integer).Value = Convert.ToInt32(txtCodigoFunci.Text); _oleCmd.Parameters.Add("@NomeFunci", OleDbType.VarChar, 255).Value = txtNomeFunci.Text.Trim(); _oleCmd.ExecuteNonQuery(); _oleCmd.Parameters.Clear(); txtCodigoFunci.ResetText(); txtNomeFunci.ResetText(); MessageBox.Show("Dados Incluídos..."); } |
No evento Click do botão Atualizar defina o código
private void btnAtualizar_Click(object sender, EventArgs e) { try { _Consulta = "UPDATE [Empregados$] "; _Consulta += "SET [NomeFunci] = @NomeFunci "; _Consulta += "WHERE "; _Consulta += "[CodFunci] = @CodFunci"; _oleCmd.CommandText = _Consulta; _oleCmd.Parameters.Add("@NomeFunci", OleDbType.VarChar, 255).Value = txtNomeFunci.Text.Trim(); _oleCmd.Parameters.Add("@CodFunci", OleDbType.Integer).Value = Convert.ToInt32(txtCodigoFunci.Text); _oleCmd.ExecuteNonQuery(); _oleCmd.Parameters.Clear(); txtCodigoFunci.ResetText(); txtNomeFunci.ResetText(); MessageBox.Show("Dados Atualizados...."); } catch (Exception ex) { MessageBox.Show(ex.Message, this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } |
No evento FormClosing do formulário Excel defina o código a seguir:
private void FormExcel_FormClosing(object sender, FormClosingEventArgs e) { if (_oleCmd != null) { _oleCmd.Parameters.Clear(); _oleCmd.Dispose(); } _oleCmd = null; if (_olecon != null) { if (_olecon.State == ConnectionState.Open) _olecon.Close(); _olecon.Dispose(); } _olecon = null; } |
Executando o projeto temos a exibição dos dados da planilha e da seleção de um dado pelo código:
A seguir temos a atualização feita e salva na planilha Excel:
Pegue o projeto completo aqui: Excel_CSharp.zip
Slm 127:1
Se o Senhor não edificar a casa, em vão trabalham os que a edificam; se o Senhor não guardar a cidade, em vão vigia a sentinela.Slm 127:2
Inútil vos será levantar de madrugada, repousar tarde, comer o pão de dores, pois ele supre aos seus amados enquanto dormem.Slm 127:3
Eis que os filhos são herança da parte do Senhor, e o fruto do ventre o seu galardão.Slm 127:4
Como flechas na mão dum homem valente, assim os filhos da mocidade.Slm 127:5
Bem-aventurado o homem que enche deles a sua aljava; não serão confundidos, quando falarem com os seus inimigos à porta.Referências: