VB .NET - Importando uma planilha Excel em um DataGridView


 Neste tutorial eu vou mostrar como podemos importar os dados de uma planilha Excel para um controle DatagridView em uma aplicação Windows Forms usando a linguagem VB .NET.(Sem usar uma referência ao assembly  Microsoft.Office.Interop.Excel)


Neste artigo eu vou acessar planilhas Excel usando ADO .NET. Nesta abordagem podemos pensar em um Workbook Excel como sendo um banco de dados e nas planilhas como sendo tabelas:

 

Excel Correspondência ADO .NET
Workbook Excel Banco de dados
Sheet Tabela

Para você se situar damos abaixo um esquema bem simples do modelo exposto pelo Excel:

No topo da hierarquia esta a classe Application

É ela que temos que instanciar em nossa aplicação Visual Basic para ter acesso as propriedades e métodos das demais classes expostas pelo Excel. 

  • Application - É a aplicação Excel

  • WorkBook  -  É o arquivo XLS 

  • WorkSheet(Sheet) - É a planilha Excel de trabalho

Pois bem , já que vamos usar ADO .NET para acessar uma planilha Excel temos que definir uma string de conexão com a planilha.

Vale lembrar que as planilhas Excel podem estar no formato da versão 97-2003 do Excel com a extensão .xls ou podem estar no formato da versão 2007 com a extensão .xlxs.

Considerando isso temos as seguintes strings de conexão possíveis:

Excel 97-2003 Format (.XLS)


  "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Teste.xls;Extended Properties='Excel 8.0;HDR=Yes'"

 

Excel 2007 Format (.XLSX)
  "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Teste.xlsx;Extended Properties='Excel 8.0;HDR=Yes'"
 

Nota:  Na versão do Excel 2007 o novo provedor - Microsoft.ACE.OLEDB.12.0 - é usado. Esta versão funciona tanto para o Excel 2007 como para o Excel 2003.

Podemos especificar se o arquivo Excel possui Header ou não usando a propriedade HDR. Quando HDR é igual a Yes, a primeira linha da planilha é considerada como Header do arquivo Excel.

Recursos usados:

Criando o projeto no Visual Studio 2013 Express for windows desktop

Abra o VS 2013 Express for windows desktop e clique em New Project;

Selecione a linguagem Visual Basic e o template Windows Forms Application;

Informe o nome LerPlanilhaExcel e clique no botão OK;

No formulário form1.vb criado por padrão no projeto vamos incluir a partir da ToolBox os seguintes controles:

Disponha os controles conforme o leiaute da figura abaixo:

A título de exemplo vamos criar uma arquivo Excel chamada PlanilhaTeste.xls contendo 3 planilhas : IDH, Populacao e Pedidos; conforme mostra a figura abaixo:

Agora vamos definir o código do formulário iniciando com a declaração dos namespaces no início do formulário:

Imports System.Data
Imports
System.Data.OleDb
Imports
System.Security

Agora no evento Click do botão procurar temos o código que usa o OpenFileDialog para abrir uma pasta para selecionar o arquivo Excel:

 Private Sub btnLocalizar_Click(sender As Object, e As EventArgs) Handles btnLocalizar.Click
        'define as propriedades do controle
        'OpenFileDialog
        Me.ofd1.Multiselect = False
        Me.ofd1.Title = "Selecionar Arquivos"
        ofd1.InitialDirectory = "C:\dados"
        'filtra para exibir somente arquivos de Excel
        ofd1.Filter = "Excel (*.xls;*.xlsx)|*.xls;*.xlsx|" & "All files (*.*)|*.*"
        ofd1.CheckFileExists = True
        ofd1.CheckPathExists = True
        ofd1.FilterIndex = 2
        ofd1.RestoreDirectory = True
        ofd1.ReadOnlyChecked = True
        ofd1.ShowReadOnly = True
        Dim dr As DialogResult = Me.ofd1.ShowDialog()
        If dr = System.Windows.Forms.DialogResult.OK Then
            ' Le os arquivos selecionados
            For Each arquivo As String In ofd1.FileNames
                txtCaminhoArquivoExcel.Text += arquivo & vbNewLine
                Try
                    ' Aqui fica o que deve ser executado com os arquivos selecionados.
                Catch ex As SecurityException
                    ' O usuário  não possui permissão para ler arquivos
                    MessageBox.Show((("Erro de segurança entre em contato com o administrador de segurança da rede." & vbLf & vbLf & "Mensagem : ") 
+ ex.Message & vbLf & vbLf & "Detalhes (enviar ao suporte):" & vbLf & vbLf) + ex.StackTrace)
                Catch ex As Exception
                    ' Não pode carregar o arquivo (problemas de permissão)
                    MessageBox.Show(("Não é possível exibir o arquivo : " & arquivo.Substring(arquivo.LastIndexOf("\"c))))
                End Try
            Next
        End If
    End Sub

O código utiliza o controle OpenFileDialog e define valores para algumas de suas propriedades. A seguir usa um laço for each para percorrer os arquivos selecionados. (Como definimos Multiselect como False poderemos selecionar apenas um arquivo)

Agora no evento Click do botão - Acessar o Excel e Importar a Planilha para o DataGridView - temos o código abaixo:

  Private Sub btnImportar_Click(sender As Object, e As EventArgs) Handles btnImportar.Click
        If String.IsNullOrWhiteSpace(txtCaminhoArquivoExcel.Text) Then
            MessageBox.Show("Infome o caminho da planilha Excel", "Caminho Planilha", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return
        End If
        If String.IsNullOrWhiteSpace(txtNomePlanilhaExcel.Text) Then
            MessageBox.Show("Infome o nome da planilha Excel", "Nome Planilha", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Return
        End If
        Dim caminhoArquivoExcel As String = txtCaminhoArquivoExcel.Text
        Dim nomePlanilhaExcel As String = txtNomePlanilhaExcel.Text & "$"
        Dim conexaoOleDb As OleDbConnection = Nothing
        Dim ds As DataSet
        Dim cmd As OleDbDataAdapter
        Try
            conexaoOleDb = New OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & caminhoArquivoExcel & ";Extended Properties=Excel 8.0;")
            cmd = New OleDbDataAdapter("Select * from [" & nomePlanilhaExcel & "]", conexaoOleDb)
            cmd.TableMappings.Add("Table", "tabelaExcel")
            ds = New DataSet
            cmd.Fill(ds)
            dgvDados.DataSource = ds.Tables(0)
        Catch ex As Exception
            MessageBox.Show(ex.ToString, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Finally
            conexaoOleDb.Close()
        End Try
    End Sub

O código verifica se o caminho e nome do arquivo Excel e o nome da planilha foram informados.

A seguir monta a string de conexão com o arquivo e extrai as informações em um DataSet que é exibido no controle DataGridView.

Se você pretende usar o Header a string de conexão dever ser definida assim:

conexaoOleDb = New OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source= " & caminhoArquivoExcel & ";Extended Properties='Excel 8.0;HDR=Yes'")

Executando o projeto iremos obter o seguinte resultado:

1- Importando dados da planilha IDH

2- Importando dados da planilha Populacao

Pegue o projeto completo aqui:  LerPlanilhaExcel.zip

Porque também nós éramos noutro tempo insensatos, desobedientes, extraviados, servindo a várias concupiscências e deleites, vivendo em malícia e inveja, odiosos, odiando-nos uns aos outros.
Mas quando apareceu a benignidade e amor de Deus, nosso Salvador, para com os homens,
Não pelas obras de justiça que houvéssemos feito, mas segundo a sua misericórdia, nos salvou pela lavagem da regeneração e da renovação do Espírito Santo,
Que abundantemente ele derramou sobre nós por Jesus Cristo nosso Salvador;
Para que, sendo justificados pela sua graça, sejamos feitos herdeiros segundo a esperança da vida eterna.

Tito 3:3-7

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti