C# - Busca dinâmica em DataGridView (importando dados do Excel)


 Neste artigo vou mostrar como realizar uma busca dinâmica em um DataGridView que esta 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. A seguir 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:

Disponha os controle conforme o leiaute 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. Eu vou criar um arquivo chamado NotasAlunos.xlsx no Excel 2017 com o seguinte conteúdo:

Implementando as funcionalidades no formulário

Eu 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 importa 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 realiza a busca dinâmica Exibir Todos que exibe todos os registros

Para concluir vamos definir 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 igua a Contabilidade :

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

(Disse Jesus) - Eu sou a videira verdadeira, e meu Pai é o lavrador.
Toda a vara em mim, que não dá fruto, a tira; e limpa toda aquela que dá fruto, para que dê mais fruto.

João 15:1,2

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 ?

Referências:


José Carlos Macoratti