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:


José Carlos Macoratti