VB .NET -  Incluindo uma tabela do Word em um DataGridView


Este artigo inicia com uma introdução tirada de meu artigo: VSTO - Visual Studio Tools for Office - Introducao - Uma introducao ao VSTO.

Não há como negar que a suíte Office composta por Word, Excel , Access , PowerPoint e Outlook reina quase que absoluta entre os aplicativos de front-end para usuários finais. O Word virou sinônimo para processador de textos, o Excel para planilha eletrônica o PowerPoint para criação de apresentações,e e assim caminha a humanidade...

Aliado a este fato as aplicações Office possuem a linguagem VBA - Visual Basic for Applications que permite aos usuários mais avançados personalizar e automatizar diversas tarefas flexibilizando ainda mais as aplicações Office. (A criação de macros também pode ser usada para personalizar aplicações Office).

Os desenvolvedores de aplicações que usam a plataforma .NET podem também efetuar a integração com as aplicações Office usando a linguagem VBA e os objetos da aplicação Office de origem. Isso sempre foi possível desde a versões mais antigas do Visual Basic e se você consultar a seção VBA do site vai encontrar alguns exemplos de aplicações criadas com o Visual Basic que interagem com aplicativos Office.

Mas onde entra o Visual Studio Tools for Office (VSTO) nessa história ?

Ora,  o VSTO se apresenta como uma ferramenta através da qual você vai poder desenvolver aplicações para o Office usando o Visual Studio e qualquer uma das linguagens que a plataforma suporta; dessa forma você poderá usar a plataforma .NET e a linguagem Visual Basic para criar aplicações Office sem a necessidade de usar o bom e velho VBA.

Com isso você vai poder criar aplicações dos tipos suportados pela plataforma .NET e usando as linguagens VB .NET e C#  e os recursos do Visual Studio como LINQ, WPF, WCF, suporte ao ClickOnce, enfim, todos os recursos da .NET Framework 3.5 com código gerenciado, ou seja o VSTO pretende unir o útil (Visual Studio) ao agradável(a interface Office).

Obs: Naturalmente o desenvolvedor da plataforma .NET e do VSTO vai ter que conhecer o modelo de objetos do Office para desenvolver aplicações para essa plataforma e integrar as características das mesmas a sua solução .NET.

Apenas para você perceber as vantagens em usar o VSTO sobre o VBA veja abaixo uma comparação entre as duas ferramentas:

VBA - Visual Basic for Applications VSTO
Usa o código que é conectado a  um documento específico. Usa o código que é armazenado separadamente do documento (para personalizações em nível de documento), ou em um assembly que é carregado pelo aplicativo (para o nível de aplicativo Adicionar-ins).
Funciona com os modelos de objeto do Office e as APIs do  VBA Funciona com os modelos de objeto do Office e as APIs do  .NET Framework.
Projetado para gravação de macro e uma experiência de desenvolvedor simplificada. Desenvolvido para segurança, manutenção do código mais fácil e a capacidade de usar o ambiente de desenvolvimento integrado completo do Visual Studio (IDE).
Funciona bem para soluções que se beneficiam de uma forte integração com aplicativos do Office (IDE, menus, botões da barra de ferramentas e assim por diante). Funciona bem para soluções que se beneficiam dos recursos completos do Visual Studio e o .NET Framework.

Nem tudo são flores no mundo VSTO : Se você for um desenvolvedor Office terá que adquirir a licença para o VSTO o que implica num custo a mais e o processo de deploy de uma solução VSTO é mais complexo que a feito pelo VBA.

Para desenvolver soluções VSTO , você deve instalar as Ferramentas do Visual Studio para o Office, que é instalado por padrão com várias versões do Visual Studio 2008. ( O VSTO já esta incluído no Visual Studio 2008 Professional )

Atualmente o VSTO esta na versão 3.0, se precisar baixe o pacote neste link:  Microsoft Visual Studio Tools for the Microsoft Office system (version 3.0 Runtime) (x86)

Obs: Além disso existe o pacote de idiomas para o VSTO que você pode baixar aqui: Pacote de idiomas para o Microsoft VSTO v3.0 SP1

Para instruções detalhadas de instalação consulte o link : http://msdn.microsoft.com/en-us/library/ms178739.aspx

Aliado a tudo o que eu já falei acrescente que você também pode estender seu código VBA com o VSTO e o código gerenciado incluindo recursos como WPF, WCF, etc., efetuando a transição e a migração das suas aplicações Office feitas em VBA para VSTO de forma gradual. Ah! e ao efetuar esta integração você poderá depurar a solução alternando os dois ambientes.

Desenvolvendo soluções para o Office com o VSTO

Você pode incorporar as características das aplicações Office em suas soluções da plataforma .NET escrevendo código que acessa o modelo de objeto das aplicações Office. O modelo de objetos do Office é um conjunto de classes que expõe as funcionalidades de cada aplicação através de vários métodos e propriedades.

Para usar as características de uma aplicação Microsoft Office a partir de uma solução do  VSTO, você precisa usar o primary interop assembly para a aplicação. O primary interop assembly permite gerenciar o código para interagir com as aplicações Office baseadas no modelo de objeto COM.

O VSTO possui vários tipos de projetos que suportam cenários de negócios diferentes para o Microsoft Office 2003 e o 2007 ( e o Office 2010 no VS 2010) , incluindo os seguintes tipos:

Nem todos aplicativos podem usar cada tipo de projeto. Por exemplo, projetos de personalização de nível de documento estão disponíveis apenas para Microsoft Office Word e o Microsoft Office Excel.

Da mesma forma, alguns recursos estão disponíveis somente para determinados tipos de projetos ou aplicativos. Por exemplo, o painel de ações está disponível apenas em projetos de nível de documento, e extensões da Faixa de Opções estão disponíveis apenas para alguns aplicativos no Office 2007.

Para decidir qual destes tipos de projetos é a melhor escolha para sua solução, você deve considerar se deseja que o seu código rode somente quando um documento específico for aberto, ou se você deseja que o seu código esteja disponível sempre que a aplicação Office estiver rodando.

Os tipos de aplicações que podem ser criadas dependem também de quais aplicações Microsoft Office você tem instalada no seu ambiente de desenvolvimento.

Antes de iniciar você deve decidir qual o melhor tipo de projeto para o seu caso. Assim se a sua aplicação Office precisa rodar cada vez que a aplicação for usada, um projeto do tipo Application-level add-ins é a melhor escolha. Se o seu código estiver fortemente integrado com um único documento, criar um projeto do tipo Document-level customizations parece ser a melhor escolha.

Se você criar um projeto do tipo  Document-level customizations também tem que considerar como ele será usado em um ambiente multiusuário: Todos irão trabalhar no mesmo documento ou cada um terá uma cópia separada do documento que poderá ser personalizado ?  Existem modelos de projetos que são adequados aos dois tipos de situação.

Se você criar um template Word você não vai poder usá-lo como um template global ou anexá-lo a documentos existentes, e,  também não existe um modelo de projeto para um arquivo Excel Add-in (.xla)

Criando o projeto Word 2007 Document no VS 2010

Neste artigo eu vou mostrar como podemos usar os recursos do VSTO para incluir uma tabela existente em um documento Microsoft Word para um  controle DataGridView existente e um formulário Windows Forms.

Para fazer isso eu vou usar o Visual Studio 2010 Professional (versão de avaliação) e o Microsoft Word 2007.

Nosso objetivo é obter a tabela abaixo existente em um documento Word:

E incluir a tabela no controle DataGridView1 existente no formulário form1.vb;

Abra o Visual Studio 2010 e no menu File->New Project, selecione o template Office -> 2007 -> Word 2007 Document e informe o nome tabelaWordGridView e clique no botão OK;

O assistente irá apresentar a janela abaixo solicitando a sua intervenção. Escolha a primeira opção - Create a New Document - e clique em OK;

Será criado um projeto contendo um documento Word 2007 (.docx) conforme a figura abaixo:

Neste momento você já pode criar a tabela no documento Word conforme a figura abaixo:

Vamos agora incluir um formulário Windows Forms no projeto. No menu Project -> Add Windows Form e a seguir selecione o Template Windows Forms aceitando o nome padrão form1.vb e clicando no botão Add;

Em seguida inclua um controle DataGridView no formulário form1.vb e clicando em DataGridView Tasks vamos incluir no DataGridView as colunas : Nome, Endereço, Telefone e Email cujos respectivas propriedades Name serão : Nome, Endereco, Telefone e Email;

Agora abra a visão de código e vamos criar algumas rotinas no formulário.

A primeira será chamada de IncluirLinhaDaTabelaNoGridView e receberá como parâmetro os nomes das colunas do DataGridView:

Public Sub IncluirLinhaDaTabelaNoGridView(ByVal nome As String, ByVal endereco As String, ByVal telefone As String, ByVal email As String)         

      DataGridView1.Rows.Add(New String() {nome, endereco, telefone, email})

End Sub

Esta rotina inclui novas linhas no DataGridView.

A outra rotina possui o mesmo nome IncluirLinhaDaTabelaNoGridView , sendo portando uma sobrecarga da rotina anterior, e, recebe uma lista de valores com o conteúdo das células que vamos incluir:

Public Sub IncluirLinhaDaTabelaNoGridView(ByVal cellValues As List(Of String))

   IncluirLinhaDaTabelaNoGridView(cellValues(0), cellValues(1), cellValues(2), cellValues(3))

End Sub

A última rotina será usada para incluir os nomes nos cabeçalhos do DataGridView a partir do nome do cabeçalho da tabela; seu nome é IncluiCabecalhoNoGridView e recebe como parâmetro uma lista de valores das células que serão incluídos:

Friend Sub IncluiCabecalhoNoGridView(ByVal cellValues As List(Of String))


   Nome.HeaderText = cellValues(0)

   Endereco.HeaderText = cellValues(1)

   Telefone.HeaderText = cellValues(2)

   Email.HeaderText = cellValues(3)
 

End Sub

Muito bem. Você acha que se executar o projeto agora a tabela será incluída no DataGridView ?

É claro que não !!!

Temos que definir o código no documento Word que vai usar as rotinas que criamos no formulário form1.vb,  e, na carga do documento irá realizar o processamento incluindo dessa forma a tabela.

Para isso clique com o botão direito sobre o documento Word , no meu projeto ele tem o nome ThisDocument.vb ,  e selecione a opção View Code;

Será aberto a janela de código exibindo dois eventos do documento : Startup e Shutdown conforme a figura abaixo:

Vamos usar o evento Startup do documento para executar o código na carga do mesmo e definir o seguinte código neste evento:

  Private Sub ThisDocument_Startup() Handles Me.Startup
        ' cria o formulário 
        formGrdv = New Form1()
        formGrdv.Show()

        ' Obtém a primeira tabela do documento Word
        '  (Lembre-se coleções no modelo Offico iniciam com 1 e não zero)
        Dim primeiraTabela As Word.Table = Me.Tables(1)
        ' Percorre as linhas na tabela e envia o conteúdo da linha
        '  para o DataGridView
        Dim contador As Integer = 0
        For Each row As Word.Row In primeiraTabela.Rows
            Dim valoresCelulas As New List(Of String)()
            For Each cell As Word.Cell In row.Cells
                Dim conteudoCelula As String = cell.Range.Text
                valoresCelulas.Add(conteudoCelula.Remove(conteudoCelula.Length - 1))
            Next

            ' primeira linha é uma coluna de cabeçalho
            If contador = 0 Then
                formGrdv.IncluiCabecalhoNoGridView(valoresCelulas)
            Else
                formGrdv.IncluirLinhaDaTabelaNoGridView(valoresCelulas)
            End If
            contador += 1
        Next
End Sub

O código esta comentado e basicamente pega a tabela do documento Word(primeira tabela), percorre as linhas da tabela e envia o conteúdo para o DataGridView usando as rotinas que criamos anteriormente.

Precisamos também declara os namespaces usados no projeto :

Imports System.Data

Imports System.Collections.Generic

Imports System.Drawing

Imports System.Windows.Forms

Imports Microsoft.VisualStudio.Tools.Applications.Runtime

Imports Word = Microsoft.Office.Interop.Word

Temos ainda que declarar a variável formGrdv do tipo form1 que iremos usamos no evento Startup:

'define um formulário do tipo de form1 (nosso formulário da aplicação Windows)
Dim formGrdv As Form1 = Nothing

Pronto já podemos executar o projeto de onde iremos obter o seguinte resultado:

Dessa forma acabamos de incluir uma tabela do Word em um controle DataGridView em um formulário Windows Forms sem muito esforço usando os recursos do VSTO.

Pegue o projeto completo aqui: tabelaWordGridView.zip (precisa do VS 2010)

Eu sei á penas VSTO, mas eu gosto...

Referências:


José Carlos Macoratti