Back-End

6 mar, 2018

C# – Busca dinâmica em DataGridView: importando dados do Excel

Publicidade

Neste artigo vou mostrar como realizar uma busca dinâmica em um DataGridView que está exibindo dados importados do Excel usando a linguagem C#.

Vamos criar uma aplicação Windows Forms na linguagem C# que vai importar um arquivo Excel exibindo os dados em um DataGridView. Em seguida vamos criar o código para realizar uma busca dinâmica no DataGridView.

Recursos usados:

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um projeto do tipo Windows Forms App com o nome C_BuscaDinamica:

No formulário Form1.cs do projeto inclua os seguintes controles:

  • 1 Combobox – cboBusca
  • 1 TextBox – txtCriterio
  • 2 Buttons – btnProcurar, btnExibirTodos
  • 1 DataGridView – dgvDados
  • 1 TextBox – txtArquivoExcel
  • 2 Buttons – btnLocalizarArquivoExcel, btnImportaExcel
  • 1 OpenFileDialog – ofd1

Disponha os controles conforme o layout da figura abaixo:

Declare os seguintes namespaces no formulário:

using System;
using System.Data;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Windows.Forms;

No início do formulário defina uma variável chamada arquivoExcel que vai conter o nome do nosso arquivo Excel que criaremos a seguir:

string arquivoExcel = @”NotasAlunos2017.xlsx”;

Preparando o arquivo Excel

Agora crie um arquivo Excel ou use um já existente. Criarei um arquivo chamado NotasAlunos.xlsx no Excel 2017 com o seguinte conteúdo:

Implementando as funcionalidades no formulário

Vou usar uma abordagem bem simples, onde vamos definir todo o código no formulário do projeto. Fiz assim para tornar o exemplo mais simples.

1- Criando o método para importar o arquivo Excel

Este método será usado para importar os dados do Excel e exibí-los no DataGridView:

private void CarregaDadosExcel()
        {
            try
            {
                //limpa o combobox
                cboBusca.Items.Clear(); 
                //converte os dados do Excel para um DataTable
                DataTable dt = GetTabelaExcel(arquivoExcel); 
                //ajusta a largura das colunas aos dados
                dgvDados.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
                dgvDados.DataSource = dt;
                //No total de registros
                lblRegistros.Text = (dgvDados.Rows.Count - 1).ToString();    
                string[] listaNomeColunas = dt.Columns.OfType<DataColumn>().Select(x => x.ColumnName).ToArray();

                //Adiciona os nomes das colunas no Combobox
                cboBusca.Items.AddRange(listaNomeColunas); 
                if (cboBusca.Items.Count > 0)
                   cboBusca.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
               MessageBox.Show("Erro :" + ex.Message);
            }
        }

Esse código obtém os dados do arquivo Excel e o converte para um DataTable preenchendo o combobox com os nomes das colunas e exibindo os dados no datagridview.

Precisamos definir o método GetTabelaExcel (arquivoExcel) cujo código é mostrado a seguir:

private DataTable GetTabelaExcel(string arquivoExcel)
        {
            DataTable dt = new DataTable();
            try
            {
                //pega a extensão do arquivo
                string Ext = Path.GetExtension(arquivoExcel);
                string connectionString = "";
                //verifica a versão do Excel pela extensão
                if (Ext == ".xls")
                { //para o  Excel 97-03    
                    connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" + arquivoExcel + "; Extended Properties = 'Excel 8.0;HDR=YES'";
                }
                else if (Ext == ".xlsx")
                { //para o  Excel 07 e superior
                    connectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source =" + arquivoExcel + "; Extended Properties = 'Excel 8.0;HDR=YES'";
                }
                OleDbConnection conn = new OleDbConnection(connectionString);
                OleDbCommand cmd = new OleDbCommand();
                OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
                cmd.Connection = conn;
                conn.Open();
                DataTable dtSchema;
                dtSchema = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string nomePlanilha = dtSchema.Rows[0]["TABLE_NAME"].ToString();
                conn.Close();
                //le todos os dados da planilha para o Data Table    
                conn.Open();
                cmd.CommandText = "SELECT * From [" + nomePlanilha + "]";
                dataAdapter.SelectCommand = cmd;
                dataAdapter.Fill(dt);
                conn.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return dt;
        }

Neste código verificamos qual a versão do Excel pela extensão do arquivo informado, e a seguir montamos a string de conexão para obter os dados da planilha e exibir no DataGridView.

2- Código dos botões para localizar e importar o arquivo Excel

Vamos definir o código no evento Click do botão de comando para localizar o arquivo Excel:

 private void btnLocalizaArquivoExcel_Click(object sender, EventArgs e)
        {
            DialogResult drResult = ofd1.ShowDialog();

            if (drResult == System.Windows.Forms.DialogResult.OK)
                txtArquivoExcel.Text = ofd1.FileName;
        }

Neste código vamos abrir uma caixa de diálogo OpenFileDialog e atribuir o nome do arquivo selecionado na caixa de texto.

Depois, vamos definir o código do evento Click do botão Importar Excel:

private void btnImportaExcel_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtArquivoExcel.Text) && File.Exists(txtArquivoExcel.Text))
            {
                arquivoExcel = txtArquivoExcel.Text;
                CarregaDadosExcel();
            }
            else
            {
                CarregaDadosExcel();
            }
        }

3- Código dos botões “Procurar” que realizam a busca dinâmica “Exibir Todos”, que por sua vez exibe todos os registros

Para concluir, definiremos o código do botão “Procurar”:

   private void btnProcurar_Click(object sender, EventArgs e)
        {
            try
            {
                ((DataTable)dgvDados.DataSource).DefaultView.RowFilter = string.Format("" + cboBusca.Text + " like '%{0}%'", txtCriterio.Text.Trim().Replace("'", "''"));
                lblRegistros.Text = (dgvDados.Rows.Count - 1).ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro :" + ex.Message);
            }
        }

Neste código estamos usando um DefaultView.RowFilter que define a expressão usada para filtrar quais linhas são exibidas no DataView.

Na consulta, obtemos o nome da coluna do combobox e o critério informado na caixa de texto usando a cláusula like ‘%{0}%’.

A seguir, temos o código do evento Click do botão “Exibir Todos”:

 private void btnExibirTodos_Click(object sender, EventArgs e)
        {
            CarregaDadosExcel();
        }

Executando o projeto, iremos obter:

1- Carregando os dados da planilha Excel no DataGridView e preenchendo o combobox:

2- Realizando uma consulta filtrando pelo Curso igual a Contabilidade:

Pegue o código do projeto aqui: C_BuscaDinamica.zip