VB.NET 2005 - Preenchendo um DataGridView a partir de um arquivo CSV


O que é um arquivo CSV ?

Um arquivo CSV (Comma Separted Value) é um formato de arquivo que é normalmente usado para troca de dados entre aplicações diferentes. O arquivo no formato CSV possui os dados delimitados onde os campos são separados pelo caractere vírgula e registros separados por uma nova linha. Este formato de arquivo é usado no Microsoft Excel ,e tornou-se um pseudo padrão para a indústria mesmo entre plataformas não Microsoft.

Embora não exista uma especificação formal para o formato CSV, a RFC 4180 descreve um formato comum e estabelece o tipo MIME "text/csv" .

Para o propósito deste artigo eu vou usar um arquivo csv chamado Clientes.csv que contém o seguinte conteúdo:

José Carlos Macoratti, Rua Projetada 100, Brasil
Janice Rachel Bueno, Av. Atlandida 90, Argentina
Jessica Lang,Pça VX Novembro 89, Inglaterra
Jefferson Kent, Rua Mirassoll 600,USA
Miriam Sanches,Av. Morales Franco 21, México

Note que arquivo possui os seguintes dados: nome, endereço e país.

Podemos usar o Microsoft Access para gerar arquivos delimitados a partir de tabelas do banco de dados Access. Vejamos um exemplo de como você pode fazer isto:

1- Abra o banco de dados Northwind.mdb no Access e selecione e abra a tabela Categories;

2- No menu Arquivo selecione a opção Exportar...;

3- Na janela do assistente informe o tipo de arquivo para o qual deseja exporta , no caso ,  Arquivos Texto na opção Salvar como tipo e clique em Exportar Tudo;

4-- Na próxima janela seleciona a primeira opção : Delimitado - Caracteres como vírgula ou tabulação separam cada campo;

5- A seguir selecione o delimitador, no nosso caso , ponto e vírgula (;) e o qualificador do Texto , aspas simples (');

   

Clique em Avançar até encerrar o processo, e, no final teremos um arquivo texto chamado Categories.csv delimitado conforme abaixo:

 

1;'Beverages';'Soft drinks, coffees, teas, beers, and ales';
2;'Condiments';'Sweet and savory sauces, relishes, spreads, and seasonings';
3;'Confections';'Desserts, candies, and sweet breads';
4;'Dairy Products';'Cheeses';
5;'Grains/Cereals';'Breads, crackers, pasta, and cereal';
6;'Meat/Poultry';'Prepared meats';
7;'Produce';'Dried fruit and bean curd';
8;'Seafood';'Seaweed and fish';
 

 

Pois bem , fiz tudo isso apenas para poder exibir o conteúdo do arquivo Clientes.csv em um controle DataGridView. Será que podemos fazer isso ?

 

Sim é possível e vamos mostrar apenas uma das formas de executar esta tarefa.

 

Você pode consultar sobre o assunto nos seguintes arquivos:

 

A classe DataGridView suporta o modelo padrão de vinculação de dados Windows Forms isto significa que a fonte de dados para um controle DataGridView pode ser qualquer tipo que implemente as seguintes interfaces:

 

O componente BindingSource é a fonte de dados preferida pois pode ser vinculada a uma grande variedade de fontes de dados e pode resolver muitas características da vinculação de dados de forma automática.

 

Com base nisto vamos criar um projeto usando o Visual Basic 2005 Express Edition com os seguintes objetivos:

A interface do projeto que conterá apenas um formulário é exibida abaixo:

 

 

Abra o Visual Basic 2005 Express Edition e crie um novo projeto chamado dataGridViewCSV incluindo os controles DataGridView, Button, e TextBox conforme o leiaute da figura acima. Inclua também um componente OpenFileDialog no formulário.

 

Agora defina os seguintes espaços de nomes (namespaces) no projeto:

Imports System.io
Imports
System.Data.oledb

A seguir no início do formulário vamos definir as variáveis objeto usadas no projeto:

Private cn As OleDbConnection = New OleDbConnection
Private cm As OleDbCommand = New OleDbCommand
Private rd As OleDbDataReader
Private adp As OleDbDataAdapter

1- Importando um arquivo CSV e exibindo no DataGridView

No evento click do botão de comando Importar arquivo CSV inclua o seguinte código:

Private Sub btnImportarCSV_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnImportarCSV.Click


'define um DataTable e um DataRow

Dim dt As New DataTable

Dim row As DataRow


'define as variáveis usadas no projeto

Dim linhaTexto As String = ""

Dim arrrayDeLinhas() As String

Dim nomeArquivo As String = ""


'define os valores padrão para o componente OpenFileDialog

OpenFileDialog1.InitialDirectory = "c:\dados\"

OpenFileDialog1.Filter = "CSV files (*.csv)|*.CSV"

OpenFileDialog1.FilterIndex = 2

OpenFileDialog1.RestoreDirectory = True


'verifica se foi escolhido um arquivo

If (OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK) Then

      nomeArquivo = OpenFileDialog1.FileName

End If

 

'atribui o nome e caminho do arquivo a caixa de texto

Me.TextBox1.Text = nomeArquivo

'define a estrutura da DataTable que vai receber os dados

dt.Columns.Add("Nome", Type.GetType("System.String"))

dt.Columns.Add("Endereco", Type.GetType("System.String"))

dt.Columns.Add("Pais", Type.GetType("System.String"))

'verifica se o arquivo existe

If File.Exists(nomeArquivo) = True Then

   'cria um novo objeto StreamReader

    Dim objReader As New StreamReader(nomeArquivo)


   
'percorre o arquivo

    Do While objReader.Peek() <> -1

        linhaTexto = objReader.ReadLine()

        arrrayDeLinhas = Split(linhaTexto, ",")

        row = dt.NewRow

        row.ItemArray = arrrayDeLinhas

        dt.Rows.Add(row)

     Loop

      'atribui ao datagridview o objeto datatable criado

     DataGridView1.DataSource = dt

Else

    MsgBox("O arquivo não foi encontrado...")

End If

End Sub

 

Executando o projeto e clicando no botão de comando para importar o arquivo csv para o datagridview iremos obter:

 

 

2- Exportando o conteúdo de um DataGridView para um arquivo CSV

Vamos fazer o caminho inverso, ou seja, carregar os dados de uma tabela no DataGridView e exportar o conteúdo de forma a gerar um arquivo delimitado padrão CSV.

No evento Click do botão - Carregar tabela - inclua o código abaixo que irá acessar a tabela employees e preencher o DataGridView.

Private Sub btnCarregaTabela_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCarregaTabela.Click

        'define a string de conexão apontando para o arquivo Northwind.mdb
        cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\dados\Northwind2.mdb"

        'abre a conexão
        Try
            cn.Open()
        Catch Ex As Exception
            MessageBox.Show(Ex.Message)
            Exit Sub
        End Try
        'define a instrução SQL para selecionar somente alguns dos campos da tabela
        cm.Connection = cn
        cm.CommandText = "select employeeID,lastname,firstname,address from employees"
        'preenche o dataset e o datagridview
        Try
            adp = New OleDbDataAdapter
            Dim ds As DataSet = New DataSet
            adp.SelectCommand = cm
            adp.Fill(ds, "dataset")
            DataGridView1.DataSource = ds
            DataGridView1.DataSource = ds.Tables(0)
            DataGridView1.Refresh()
        Catch Ex As Exception
            MessageBox.Show(Ex.Message)
        Finally
            cn.Close()
        End Try
    End Sub

Agora vamos incluir o código que irá exporta o conteúdo carregado do DataGridView para um arquivo texto padrão CSV no evento click do botão de comando : Exportar para o formato CSV.

Private Sub btnExportaCSV_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExportaCSV.Click

gerarArquivoCSV(Me.TextBox1.Text)
leArquivoCSV(
Me
.TextBox1.Text)

End Sub

Na verdade o código acima chama duas rotinas:

  1. gerarArquivoCSV() - gera o arquivo CSV passando o nome caminho do arquivo a ser gerado;
  2. leArquivoCSV() - lê e exibe o arquivo gerado

Vejamos o código de cada uma delas:

1- gerarArquivoCSV()

Private Sub gerarArquivoCSV(ByRef nomeArquivo As String)

        'define as variáveis usadas no projeto
        Dim I As Integer = 0
        Dim j As Integer = 0
        Dim valorCelula As String = ""
        Dim linha As String = ""

        'verifica se o arquivo existe e exclui o arquivo ja existente
        Try
            If File.Exists(nomeArquivo) = True Then
                File.Delete(nomeArquivo)
                MsgBox("Arquivo " & nomeArquivo & " excluido...")
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
            Exit Sub
        End Try

        'define um objeto do tipo StreamWriter
        Try
            Dim objWriter As New StreamWriter(nomeArquivo, True)
            'percorre o datagridview obtendo o valor de cada célula e montando a linha 
            For j = 0 To (DataGridView1.Rows.Count - 2)
                For I = 0 To (DataGridView1.Columns.Count - 1)
                    If Not TypeOf DataGridView1.CurrentRow.Cells.Item(I).Value Is DBNull Then
                        valorCelula = DataGridView1.Item(I, j).Value
                    Else
                        valorCelula = ""
                    End If
                    linha = linha + valorCelula + ","
                Next
                'escreve a linha no arquivo 
                objWriter.WriteLine(linha)
                linha = ""
            Next
            'fecha o arquivo texto
            objWriter.Close()
            MsgBox("Arquivo Texto gerado com sucesso.")
        Catch e As Exception
            MessageBox.Show("Ocorreu um erro durante a escrita no arquivo.  " + e.ToString())
        Finally
            'fecha o arquivo
            FileClose(1)
        End Try
    End Sub

Após gerar o arquivo a rotina leArquivoCSV() é chamada para exibir o conteúdo na caixa de texto com a propriedade Multiline igual a True:

Private Sub leArquivoCSV(ByVal nomearquivo As String)
 

Dim linhaTexto As String = ""


If
File.Exists(nomearquivo) = True
Then

    Dim objReader As New StreamReader(nomearquivo)
 

    Do While objReader.Peek() <> -1

       linhaTexto = linhaTexto & objReader.ReadLine() & vbNewLine

     Loop
 

     TextBox2.Text = linhaTexto

Else

     MsgBox("Arquivo não existe.")

End If

End Sub

Executando o projeto para esta opção iremos obter:

 

Como você pode notar nada de muito complicado.
 

Existem muitas outras formas de realizar esta mesma tarefa e o código das rotinas usadas pode ser ainda mais refinado. Fica como exercício...

 

Pegue o código completo do projeto aqui: datagridviewCSV.zip

 

Até o próximo artigo VB.NET ...


José Carlos Macoratti