VB .NET - Gerenciando dados do Excel 2003


Este artigo tem como objetivo permitir que você, através do VB .NET, gerencie dados de uma planilha Excel na versão 2003.

Por que você faria isso ???

Boa pergunta, garoto...

Aprendi uma coisa na área de TI: nunca diga: "Jamais vou precisar disso..."

Dessa forma nosso objetivo é bem modesto e talvez você nem leia este artigo até essas linhas mas se um dia você precisar deste recurso vai dar conta do recado.

Antes de iniciar vou dar uma explicação resumida sobre o projeto:

Abaixo vemos a interface da nossa aplicação VB .NET:

Observe que temos algumas informações exibida no controle DataGridView e as mesmas informações exibidas como detalhes nas caixas de texto do formulário.

Note que temos botões de navegação que permitem que percorramos os registros e também botões que irão acionar rotinas que permitem: Incluir, Alterar, Procurar registros.

A fonte das informações que vemos exibidas na interface do nosso programa Visual Basic é uma planilha Excel versão 2003 chamada Clientes.xls que esta na pasta c:\dados.

Abaixo vemos a figura da planilha Excel - Clientes.xls que a nossa fonte de dados:

Como estamos acessando essa planilha ?

A planilha esta sendo acessada através de um provedor OleDb por  meio do qual estamos criando uma conexão com a planilha.

Por este motivo nosso projeto irá precisar usar o namespace : System.Data.Oledb

Com isso você não vai precisar ter o Excel instalado na sua máquina.

Outro ponto importante é que como não temos uma chave primária na coluna da planilha do Excel, e  temos que definir uma chave primária na tabela que estamos criando, pois vamos procurar registros na tabela usando o método Find. Veja o exemplo do código usado para definir uma chave primária:

ds.Tables(0).Constraints.Add("pk_id", ds.Tables(0).Columns(0), True)

Temos que fazer isso pois vamos usar o método Find da coleção Rows() para procurar um registro na planilha.

Dim drow As DataRow = ds.Tables(0).Rows.Find(n)

Nota: Se tivéssemos usando um banco de dados ao invés da planilha o código abaixo teria o mesmo efeito:

adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey

Isso posto vamos ao projeto...

Eu estou usando o Visual Basic 2008 Express Edition e uma planilha do Excel 2003 no nosso caso o arquivo clientes.xls.

Abra o VB 2008 Express e crie um novo projeto do tipo Windows Application com o nome AcessoExcel;

No formulário padrão form1.vb inclua os controles :

o leiaute do formulário pode ser visto na figura abaixo:

Vamos usar os eventos de cada botão para neles incluir o código que realizar uma operação.

Antes disso temos que declarar as variáveis usadas no projeto:

'variaveis usadas para acessar a planilha e executar os comandos de manutenção
Dim con As OleDbConnection
Dim da As OleDbDataAdapter
Dim cmd As OleDbCommand
Dim ds As DataSet
'usada para controlar a posição do registro
Dim reg As Integer = 0

1- Evento Load do formulário: Neste evento inclua o código:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        con = New OleDbConnection("Provider=Microsoft.Jet.Oledb.4.0;data source=C:\dados\Clientes.xls;Extended Properties=""Excel 8.0;HDR=Yes;"" ")
        'Clientes.xls ->MS.Excel-2003, a definição hdr=yes-> indica que a primeira linha é considerada cabeçalho
        carregadados()
        exibeDados()
    End Sub

Estabelecemos a conexão com a planilha e carregamos e exibimos os dados chamando as rotinas: carregaDados e exibeDados;

2- A seguir temos a rotina carregaDados:

Private Sub carregadados()
        da = New OleDbDataAdapter("select * from [Clientes$]", con)
        'Clientes-> nome da planilha no arquivo CLientes.xls, deve ser indicado como [Clientes$]
        ds = New DataSet()
        da.Fill(ds, "Clientes")
        'criando uma chave primária na tabela [Clientes] do dataset para usar o método Find
        ds.Tables(0).Constraints.Add("pk_id", ds.Tables(0).Columns(0), True)
        'exibindo os dados no datagridview
        gdvClientes.DataSource = ds.Tables(0)
    End Sub

Selecione os dados da planilha e cria um dataset preenchendo-o com os dados a seguir define a chave primária do datatable e exibe os dados no controle DataGridView;

3- Abaixo vemos o código da  rotina exibeDados;

Private Sub exibeDados()
        txtCodigo.Text = ds.Tables(0).Rows(reg)(0).ToString()
        txtNome.Text = ds.Tables(0).Rows(reg)(1).ToString()
        txtEmail.Text = ds.Tables(0).Rows(reg)(2).ToString()
    End Sub

O código apenas atribui os valores das colunas da tabela referente ao registro atual aos controles do formulário;

4-  Para Incluir uma nova linha na planilha usamos  seguinte rotina:

Private Sub btnIncluir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnIncluir.Click
        'inclui dados na planilha
        cmd = New OleDbCommand((("insert into [Clientes$] values(" + txtCodigo.Text & ",' ") + txtNome.Text & " ',' ") + txtEmail.Text & " ') ", con)
        con.Open()
        Dim n As Integer = cmd.ExecuteNonQuery()
        con.Close()
        If n > 0 Then
            MessageBox.Show("Registro inserido com sucesso")
            carregadados()
        Else
            MessageBox.Show("Inclusão de registro falhou")
        End If
    End Sub

Definimos uma instrução SQL Insert into e excutamos o comando usando o método ExecuteNonQuery() para incluir as informações;

5- Para Alterar as informações de uma linha existente na planilha usamos o código a seguir:

 Private Sub btnAlterar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlterar.Click
        'atualiza dados na planilha
        cmd = New OleDbCommand(((" update [Clientes$] set nome='" + txtNome.Text & "',email='") + txtEmail.Text & "' where id=") + txtCodigo.Text & " ", con)
        con.Open()
        Dim n As Integer = cmd.ExecuteNonQuery()
        con.Close()
        If n > 0 Then
            MessageBox.Show("Registro atualizado com sucesso.")
            carregadados()
        Else
            MessageBox.Show("Atualização de registro falhou.")
        End If
    End Sub

Definimos uma instrução SQL Update/Set e excutamos o comando usando o método ExecuteNonQuery() para alterar as informações;

6- Para Procurar um registro usamos o seguinte código:

Private Sub btnProcurar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcurar.Click
        Try
            Dim n As Integer = Convert.ToInt32(InputBox("Informe o código do Cliente:", "Procurar", "2", 400, 400))
            Dim drow As DataRow = ds.Tables(0).Rows.Find(n)
            If drow IsNot Nothing Then
                txtCodigo.Text = drow(0).ToString()
                txtNome.Text = drow(1).ToString()
                txtEmail.Text = drow(2).ToString()
            Else
                MessageBox.Show("Registro não encontrado na planilha")
            End If
        Catch ex As Exception
            'O objetivo de não tratar erro e deixar a aplicação continuar a executar (isso não é uma boa pratica)
        End Try
    End Sub

Usamos a função InputBox para solicitar o código do cliente a ser procurado e usamos o método Find para localizá-lo exibindo as informações nas caixas de texto.

7- Para limpar as caixas de texto usamos esta rotina:

 Private Sub btnLimpar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLimpar.Click
        txtCodigo.Text = ""
        txtNome.Text = ""
        txtEmail.Text = ""
    End Sub

8- Navegação pelos registros é feita usando o evento Click dos botões de navegação através da verificação da existência de linhas na tabela e em seguida da obtenção da posição atual do registro. A rotina exibeDados é chamada para mostrar os dados.

Private Sub btnPrimeiro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrimeiro.Click
        If ds.Tables(0).Rows.Count > 0 Then
            reg = 0
            exibeDados()
            MessageBox.Show("Primeiro Registro")
        Else
            MessageBox.Show("Não há registros")
        End If
    End Sub

    Private Sub btnAnterior_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAnterior.Click
        If ds.Tables(0).Rows.Count > 0 Then
            If reg > 0 Then
                reg -= 1
                exibeDados()
            Else
                MessageBox.Show("Primeiro Registro")
            End If
        Else
            MessageBox.Show("Não há registros")
        End If
    End Sub

    Private Sub btnProximo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProximo.Click
        If ds.Tables(0).Rows.Count > 0 Then
            If reg < ds.Tables(0).Rows.Count - 1 Then
                reg += 1
                exibeDados()
            Else
                MessageBox.Show("Último Registro")
            End If
        Else
            MessageBox.Show("Não há registros")
        End If
    End Sub

    Private Sub btnUltimo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUltimo.Click
        If ds.Tables(0).Rows.Count > 0 Then
            reg = ds.Tables(0).Rows.Count - 1
            exibeDados()
            MessageBox.Show("Último registro")
        Else
            MessageBox.Show("Não há registros")
        End If
    End Sub

E assim podemos realizar a manutenção dos dados da planilha em uma aplicação VB .NET sem ter o Excel instalado , precisamos apenas da planilha.

Eu sei é apenas VB .NET, mas eu gosto...

Pegue o projeto completo aqui: AcessoExcel.zip

Flp 4:6 Não andeis ansiosos por coisa alguma; antes em tudo sejam os vossos pedidos conhecidos diante de Deus pela oração e súplica com ações de graças;

Flp 4:7 e a paz de Deus, que excede todo o entendimento, guardará os vossos corações e os vossos pensamentos em Cristo Jesus.

Referências:

José Carlos Macoratti