WPF - Lendo dados do Excel e exibindo em um DataGrid


No artigo de hoje veremos como acessar uma planilha Excel e exibir os dados em um controle DataGrid da WPF.

O controle DatGrid da WPF foi incluído a partir da versão do Visual Studio 2008 (.NET Framework 3.5 SP1) como uma instalação do WPF ToolKit. A partir da versão 4.0 do .NET Framework ele esta integrado ao Visual Studio.

Se você estiver usando o VS 2008 deverá incluir este componente em seu projeto conforme o roteiro abaixo:

O componente DataGrid pode ser considerado uma tabela composta de linhas e colunas, possuindo muitas propriedades e eventos que permitem a sua configuração. A propriedade ItemsSource é usada para preencher o controle com dados.

Eu já escrevi diversos artigos sobre o controle DataGrid da WPF e você pode acessá-los nas referências no final deste artigo.

 

Neste artigo iremos acessar uma planilha Excel chamada MacorattiVendas.xlsx (estou usando a versão 2007 do Excel) que se encontra na pasta C:\dados da minha máquina.

 

Para acessar a planilha vou utilizar uma referência ao objeto COM - Microsoft Excel 12.0 Object Library - para a seguir declarar o namespace  Microsoft.Office.Interop.Excel no projeto.

 

Existem outras maneiras de acessar uma planilha Excel como usar um provedor OLEDB e definir uma string de conexão da seguinte forma:

 

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + arquivoExcel + ";Extended Properties=Excel 12.0;Persist Security Info=True";
 

Após acessar a planilha iremos ler seus dados e usando DataBinding da WPF iremos exibir os dados em um controle DataGrid.

 

Para isso definimos a propriedade ItemsSource="{Binding}" no arquivo MainWindow.xaml e a propriedade DataContext no arquivo code-behind MainWindow.xaml.cs.

 

Recursos Usados:

Criando o projeto no Visual Studio Express 2013

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

A seguir selecione a linguagem Visual C# e o template WPF Application informando o nome Wpf_Excel_DataGrid:

Será criado um projeto com uma solução contendo os arquivos exibidos na janela Solution Explorer conforme figura abaixo:

Vamos incluir uma referência à biblioteca Microsoft.Office.Interop.Excel;

Para isso clique no menu PROJECT e a seguir em Add Reference;

Selecione a guia COM da janela Reference Manager e a seguir selecione o item : Microsoft Excel 12.0 Object Library (pode variar dependendo da versão do seu Excel instalado)

Após isso vamos incluir uma classe em nosso projeto que irá usar a referência acima e acessar os dados na planilha Excel.

No menu PROJECT clique em Add New Item;

Selecione o template Class e informe o nome ExcelDados.cs;

A seguir inclua o código abaixo nesta classe:

using System;
using System.Data;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
namespace Wpf_Excel_DataGrid
{
    public class ExcelDados
    {
        public DataView DadosExcel
        {
            get
            {
                //cria uma instância do Excel, do workbook e da planilha
                Excel.Application excelApp = new Excel.Application();
                Excel.Workbook workbook;
                Excel.Worksheet worksheet;
                //define um objeto range
                Excel.Range range;
                //pega a planilha na pasta bin/Debug
                //workbook = excelApp.Workbooks.Open(Environment.CurrentDirectory + "\\MacorattiVendas.xlsx");
                //pega o arquivo Excel na pasta indicada
            workbook = excelApp.Workbooks.Open("c:\\dados\\MacorattiVendas.xlsx);
                // Abre a planilha indicada
                worksheet = (Excel.Worksheet)workbook.Sheets["Vendas"];
                int column = 0;
                int row = 0;
                range = worksheet.UsedRange;
                //Cria um DataTable e adiciona as colunas
                DataTable dt = new DataTable();
                dt.Columns.Add("Codigo");
                dt.Columns.Add("Nome");
                dt.Columns.Add("Mes");
                dt.Columns.Add("Valor");
                //percorre a planilha a partir da segunda linha e obtém os dados
                for (row = 2; row <= range.Rows.Count; row++)
                {
                    DataRow dr = dt.NewRow();
                    for (column = 1; column <= range.Columns.Count; column++)
                    {
                        'verifica o valor da coluna e trata os valores nulos
                        dr[column - 1] = (range.Cells[row, column] as Excel.Range).Value2 != null ? 
(range.Cells[row, column] as  Excel.Range).Value2.ToString() : "";
                    }
                    dt.Rows.Add(dr);
                    dt.AcceptChanges();
                }
                //fecha a pasta de trabalho e o Excel
                workbook.Close(true, Missing.Value, Missing.Value);
                excelApp.Quit();
                return dt.DefaultView;
            }
        }
    }
}

 

O código acima acessa a planilha Excel e retorna um DataView, ele esta comentando e dispensa explicações mas eu só quero fazer uma consideração.

 

Podemos melhorar o código lendo os valores dos cabeçalhos das colunas diretamente e não definindo-os via código conforme foi feito.

 

Para isso basta comentar as linhas que definem as colunas e incluir a linha de código em azul conforme o trecho de código mostrado a seguir:

 

....
                 DataTable dt = new DataTable();
                //dt.Columns.Add("Codigo");
                //dt.Columns.Add("Nome");
                //dt.Columns.Add("Mes");
                //dt.Columns.Add("Valor");
                for (column = 1; column <= range.Columns.Count; column++)
                {
                    dt.Columns.Add((range.Cells[1, column] as Excel.Range).Value2.ToString());
                }
....
....

 

Vai funcionar da mesma forma e fica mais elegante.


Agora vamos definir a interface no arquivo MainWindow.xaml incluindo a partir da ToolBox um controle DataGrid conforme figura abaixo:

 

 

No arquivo code-behind MainWindow.xaml.cs inclua o código que usa a classe ExcelDados() para obter os dados da planilha e atribuir ao DataContext do DataGrid.

 

using System.Windows;
namespace Wpf_Excel_DataGrid
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            ExcelDados excelDados = new ExcelDados();
            this.gridExcel.DataContext = excelDados.DadosExcel;
        }
    }
}

 

O DataContext é um dos conceitos mais fundamentais do DataBinding ou ligação de dados. O objeto Binding precisa obter seus dados de algum lugar, e há algumas maneiras de especificar a fonte dos dados, como usar a propriedade Source diretamente no Binding, herdando um DataContext do elemento mais próximo e definindo o ElementName e as propriedades RelativeSource no objeto de vinculação.

Elementos de interface de usuário no WPF, como o DataGrid,  possuem uma propriedade de dependência chamada DataContext.

Essa propriedade tem a característica mencionada "value inheritance" ativada, por isso, se você definir o DataContext em um elemento a um objeto da sua fonte de dados, a propriedade DataContext em todos os seus elementos descendentes lógicas irá referenciar esse objeto também.

Isto significa que todas as ligações de dados contidas no elemento árvore desse elemento raiz irão vincular automaticamente o objeto da fonte de dados, a menos que você defina explicitamente a vinculação com outra fonte. Este recurso é extremamente útil ao projetar aplicativos WPF.

 

No código, nós estamos usando o DataContext do controle vinculando-o à fonte de dados retornado da classe que acessa os dados da planilha Excel.

 

A planilha Excel MacorattiVendas.xlsx que iremos acessar na pasta c:\dados esta descrita a seguir:

 

 

Executando o projeto iremos obter o seguinte resultado final:

 

 

Pegue projeto completo aqui:  Wpf_Excel_DataGrid.zip

 

De sorte que haja em vós o mesmo sentimento que houve também em Cristo Jesus,
Que, sendo em forma de Deus, não teve por usurpação ser igual a Deus,
Mas esvaziou-se a si mesmo, tomando a forma de servo, fazendo-se semelhante aos homens;
E, achado na forma de homem, humilhou-se a si mesmo, sendo obediente até à morte, e morte de cruz.

Filipenses 2:5-8

 

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