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:
Interface IList , incluindo arrays de uma dimensão;
Interface IListSource , como as classes DataTable e DataSet;
Interface IBindingList , como a classe BindingList;
Interface IBindingListView como a classe BindingSource;
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:
Abrir um arquivo .csv e exibir o seu conteúdo em um DataGridView;
Exportar o conteúdo de um DataGridView para um arquivo texto;
Exibir o arquivo texto gerado;
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.ioA seguir no início do formulário vamos definir as variáveis objeto usadas no projeto:
Private cn As OleDbConnection = New OleDbConnection1- 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 StreamReaderDim objReader As New StreamReader(nomeArquivo)
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 ElseMsgBox( "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:
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 ElseMsgBox( "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