Personalizando o Office com o VSTO 3.0

Bruno Sonnino
Microsoft MVP
Dezembro 2008

Tecnologias: Visual Studio 2008, Visual Studio Tools for Office (VSTO 3.0)
Sumário: Esse artigo mostra como utilizar VSTO no Visual Studio 2008 para construir add-ins para seus documentos ou aplicações.

Conteúdo

Introdução
Programando com o VSTO
Add-in para Word
Add-in para Excel
Criação de uma Form Region no Outlook
Distribuindo os Add-ins
Desinstalando os Add-ins
Conclusões
Sobre o Autor

Introdução

Uma das inovações introduzidas com o Visual Studio 2008 foi o VSTO 3.0 (Visual Studio Tools for Office), um conjunto de ferramentas que permite desenvolver Add-Ins para as aplicações Office.

Embora a programação para Office não seja nova (O VBA – Visual Basic for Applications – está disponível desde as primeiras versões do Office), o VSTO tem um grande diferencial sobre o VBA: com ele, podemos usar código gerenciado e programar usando linguagens como C# ou VB.net. O Visual Studio 2005 trouxe o VSTO para o Office 2003, e podíamos baixar o VSTO Second Edition, que permite o desenvolvimento para Office 2007.

O VSTO 3.0, disponível no Visual Studio 2008 trouxe novos aprimoramentos, como o desenho Visual do Ribbon. Este artigo irá mostrar como criar Add-Ins para o Word, Excel e Outlook, integrando-as com suas bases de dados, fazendo com que os usuários possam acessar dados do negócio dentro das aplicações do Office.

Início da Página

Programando com o VSTO

Podemos criar dois tipos de aplicações com o VSTO:

  • Add-ins de documentos – são aplicações que afetam um único documento. Ao abrir o documento, o add-in é carregado e passa a fazer parte dele, Neste caso, o add-in refere-se apenas ao documento em questão, outros documentos não acessam o add-in. Um exemplo deste tipo de add-in poderia ser um contrato especial. Ao abrir o contrato, o add-in acessa a base de dados de clientes e permite selecionar um cliente. Ao selecionar o cliente, os seus dados são colocados no contrato, este é impresso e a base de dados é atualizada, com a inclusão deste novo contrato nos registros do cliente.
  • Add-ins de aplicação – afetam a aplicação como um todo. Toda vez que a aplicação é aberta, o add-in é carregado e fica disponível para o usuário. Em geral, é criada uma nova aba do Ribbon para que este add-in possa ser executado. Um exemplo seria um add-in para o Outlook que carrega a base de um CRM ligada ao contato. Quando se seleciona um contato, as informações do CRM são acessadas e mostradas numa janela do Outlook. Desta maneira, o usuário não precisa sair do Outlook para acessar essas informações.

Podemos criar um add-in do VSTO selecionando a opção File/New/ Project e escolhendo a opção Office, como mostra a Figura 1.

Figura 1 – Tela de seleção do tipo de projeto

Figura 1 – Tela de seleção do tipo de projeto

Podemos criar add-ins para o Office 2003 ou para o Office 2007. Neste artigo criaremos três add-ins: um add-in de documento para o Word, um add-in de aplicação para o Excel e uma Form Region para o Outlook.

Início da Página

Add-in para o Word

Inicialmente iremos criar um add-in de documento para o Word. No Visual Studio, selecione Word 2007 Document e dê o nome de Contrato. Na tela seguinte (Figura 2), selecione a criação de um novo documento.

Figura 2 - Tela de seleção de documento

Figura 2 - Tela de seleção de documento

O Word é mostrado no Visual Studio, com um novo documento aberto (Figura 3)

Figura 3 – Visual Studio editando um add-in de documento Word

Figura 3 – Visual Studio editando um add-in de documento Word

Podemos colocar no documento o texto de nosso contrato. Adicione ao documento, um texto com o seguinte:

PROCURAÇÃO

Eu, Cliente, residente em Endereço, Cidade, Estado por este instrumento particular de procuração, nomeio e constituo meu bastante procurador Fulano de Tal, residente na Rua dos Trilhos, 500, nesta Capital, outorgando-lhe o poder de representar-me junto às reuniões de condomínio do edifício Dias Felizes.

Cidade, Data

Em seguida, iremos acrescentar nosso banco de dados ao projeto. Adicione o arquivo do banco de dados Northwind ao projeto. Uma tela para selecionar o dataset é aberta. Selecione a tabela Employees e dê o nome de EmployeesDataset a ele. O dataset é criado. Em seguida, iremos colocar nossos bookmarks no texto.

Na toolbox, na aba Word Controls encontramos os controles que podem ser adicionados ao documento Word (Figura 4). Adicione um Bookmark ao documento. Selecione a palavra Cliente e clique em Ok. Um Bookmark é criado para a palavra cliente e ela fica marcada entre colchetes. Faça o mesmo com as palavras Endereço, Cidade, Estado e Data.

Figura 4 – Toolbox de controles do Word

Figura 4 – Toolbox de controles do Word

Em seguida, iremos adicionar uma ActionsPane ao projeto. No Solution Explorer, clique com o botão direito no projeto e selecione Add New Item, e selecione Actions Pane Control. Dê o nome de ProcuracaoActionsPane. Uma tela semelhante à da edição de um UserControl é mostrada. Lá podemos colocar nossos controles.

Mostre os datasources do projeto, usando a opção Data/Show DataSources. Arraste a tabela Employees para a área de desenho. Um BindingNavigator e uma DataGridView são adicionadas ao controle. Apague o BindingNavigator e selecione a SmartTag da DataGridView e desmarque as opções Enable adding, Enable edititing e Enable deleting. Selecione a opção Edit Columns, deixando apenas as colunas LastName, FirstName, Address, City, Region. Insira um botão e mude a propriedade Text para Inserir. Você deve ter uma tela semelhante à Figura 5.

Figura 5 – ActionPane final

Figura 5 – ActionPane final

Dê um duplo clique no botão para abrir o editor de código no manipulador do evento Click e coloque o seguinte código:

if (employeesDataGridView.CurrentRow != null)
{
    Globals.ThisDocument.bookmark1.Text = String.Format("{0} {1}",
        employeesDataGridView.CurrentRow.Cells[1].Value,
        employeesDataGridView.CurrentRow.Cells[0].Value);
    Globals.ThisDocument.bookmark2.Text =
        employeesDataGridView.CurrentRow.Cells[2].Value.ToString();
    Globals.ThisDocument.bookmark3.Text =
        employeesDataGridView.CurrentRow.Cells[3].Value.ToString();
    Globals.ThisDocument.bookmark4.Text =
        employeesDataGridView.CurrentRow.Cells[4].Value.ToString();
    Globals.ThisDocument.bookmark5.Text =
        employeesDataGridView.CurrentRow.Cells[3].Value.ToString();
    Globals.ThisDocument.bookmark6.Text = DateTime.Now.Date.ToLongDateString();
}

Este código substitui os bookmarks selecionados com os dados do registro selecionado. Devemos ainda ligar os dados da tabela à DataGridView. No construtor do UserControl, coloque o seguinte código:

public ProcuracaoActionsPane()
{
    InitializeComponent();
    employeesDataGridView.DataSource =
         employeesTableAdapter.GetData();
}

Finalmente, resta apenas adicionar o controle à lista de ActionsPanes do documento. Em ThisDocument.cs, no método ThisDocument_Startup (que é executado quando o documento é inicializado, coloque o seguinte código:

private void ThisDocument_Startup(object sender, System.EventArgs e)
{
    ActionsPane.Controls.Add(new ProcuracaoActionsPane());
}

Execute o programa e veja que os dados estão mostrados na ActionsPane, ao lado do documento. Ao clicar no botão Inserir, os dados são inseridos no documento (Figura 6).

Figura 6 – Word com ActionsPane ativa e dados do registro atual inseridos no documento

Figura 6 – Word com ActionsPane ativa e dados do registro atual inseridos no documento

Início da Página

Add-in para o Excel

Criaremos a seguir um add-in para o Excel. Diferentemente do add-in anterior, este não estará ligado a um documento específico, mas ao Excel, como um todo. Faremos um gerador de números primos que insere os “n” primeiros números primos na célula atual e nas seguintes.

Para criar um add-in para o Excel, selecionamos a opção File/New/Project e selecionamos Excel 2007 Add-in, dando o nome de NumerosPrimos. No Solution Explorer, selecione o projeto e dê um clique direito no mouse, escolhendo a opção Add New Item. Escolha Ribbon (Visual Designer) e dê o nome de PrimosRibbon.

O editor da ribbon é mostrado, como na Figura 7.

Figura 7 – Editor da Ribbon

Figura 7 – Editor da Ribbon

Lá podemos fazer a edição de nossa ribbon como qualquer outro componente visual. Selecione a aba e mude a propriedade Label para Números Primos. Selecione o grupo e mude a propriedade Label para Primos.

Adicione um botão e mude a propriedade ControlSize para RibbonControlSizeLarge. Mude a propriedade Label para Gera e mude a propriedade OfficeImageId para HappyFace. O OfficeImageId é uma identificação das imagens embutidas no Office. Para obter uma lista destes ids, você pode baixar a galeria de ícones do Office 2007 em https://www.microsoft.com/downloads/details.aspx?familyid=12b99325-93e8-4ed4-8385-74d0f7661318&displaylang=en. Não é necessário usar uma imagem do Office. Podemos usar uma imagem personalizada, preenchendo a propriedade Image.

Dê um clique duplo no botão para abrir o editor de código, no evento Click do botão. Antes de colocarmos um código aí, criaremos uma Form que solicita a quantidade de números a ser gerada. De um clique com o botão direito do mouse no projeto e selecione Add new item, escolhendo Windows Form. Dê o nome de PrimosForm. Altere sua propriedade Text para Gera números primos.

Insira um Label, um NumericUpdown e dois botões  na Form. Altere a propriedade Text do Label para Quantidade, a propriedade Text do primeiro botão para OK e a propriedade DialogResult do botão para OK.Altere a propriedade Text do segundo botão para Cancelar e a sua propriedade DialogResult para Cancel.

No código da Form, coloque a seguinte propriedade:

public int Quantidade
{
    get { return Convert.ToInt32(numericUpDown1.Value);}
    set { numericUpDown1.Value = value; }
}

Retorne à edição do evento Click do botão da Ribbon e coloque o seguinte código:

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    PrimosForm form = new PrimosForm();
    if (form.ShowDialog() == DialogResult.OK && form.Quantidade > 0)
    {
        int[] primos = GeraPrimos(form.Quantidade);
        Microsoft.Office.Interop.Excel.Application excelApp = Globals.ThisAddIn.Application;
        Range currCell = excelApp.ActiveCell;
        int linha = currCell.Row;
        int coluna = currCell.Column;
        foreach (var numPrimo in primos)
        {
            excelApp.Cells[linha, coluna] = numPrimo;
            linha++;
        }
    }
}

Adicione os namespaces System.Windows.Forms e System.Office.Interop.Excel  à lista de namespaces usados. A função mostra a Form que criamos, que solicita a quantidade de números a ser gerada, gera os números primos e coloca-os no Excel, abaixo da célula selecionada.

A função GeraPrimos gera os “n” primeiros números primos e retorna numa matriz de números inteiros:

private static int[] GeraPrimos(int Quantidade)
{
    if (Quantidade < 1)
        return null;
    int[] primos = new int[Quantidade];
    primos[0] = 2;
    if (Quantidade == 1)
        return primos;
    primos[1] = 3;
    if (Quantidade == 2)
        return primos;
    for (int i = 2; i < Quantidade; i++)
    {
        int num = primos[i - 1] + 2;
        while (true)
        {
            bool achouPrimo = false;
            int maxTeste = (int)Math.Sqrt(num);
            for (int k = 1; k < i; k++)
            {
                if (primos[k] > maxTeste)
                {
                    achouPrimo = true;
                    break;
                }
                if ((num % primos[k]) == 0)
                {
                    num += 2;
                    break;
                }
            }
            if (achouPrimo)
            {
                primos[i] = num;
                break;
            }
        }
    }
    return primos;
}

Desta maneira, podemos executar o projeto. O Excel é aberto, com uma nova aba e, nesta aba, um novo botão (Figura 8).

Figura 8 – Excel com aba e botão customizado

Figura 8 – Excel com aba e botão customizado

Clicando no botão, é mostrada a janela solicitando a quantidade. Ao confirmar, os números primos são colocados na planilha.

Início da Página

Criação de uma Form Region no Outlook

O Outlook permite a customização de partes da janela, onde podem ser mostradas informações complementares ao que se está exibindo. Por exemplo, podemos mostrar fotos de um contato ou mesmo uma região onde podemos mandar um e-mail para nosso contato, sem sair da visualização de contatos.

Para criar uma Form region, crie um novo projeto no Visual Studio, do tipo Outlook 2007 AddIn e dê o nome de MapaContato. No projeto, adicione um novo item do tipo Outlook Form Region. Em seguida, abre-se um assistente para selecionar o tipo de form region desejada. Na primeira tela (Figura 9), é perguntado se queremos criar uma nova form region ou importar uma existente. Selecione a opção de criar uma nova region.

Figura 9 – Assistente para criação de form regions

Figura 9 – Assistente para criação de form regions

A segunda tela (Figura 10) pergunta o tipo de região que deve ser criada. Temos quatro tipos de seleção

Separate – adiciona uma nova página na janela do Outlook

Adjoining – adiciona a janela à parte de baixo da janela default do Outlook

Replacement – substitui a página default do Outlook

Replace all – substitui todas as páginas do Outlook

Figura 10 – Seleção do tipo de região

Figura 10 – Seleção do tipo de região

Na página seguinte, é solicitado o nome da região. Dê o nome de Mapa. Em seguida, é perguntado para quais classes a região deve ser apresentada (Figura 11). Aqui podemos selecionar aonde a janela aparecerá. Nossa janela está ligada ao contato. Desta maneira, selecionamos apenas esta classe e finalizamos o assistente.

Figura 11 – Seleção das classes onde a região será mostrada

Figura 11 – Seleção das classes onde a região será mostrada

Uma tela para desenho da janela é mostrada e podemos colocar controles ali, da mesma maneira que desenhamos uma form. Coloque na janela um WebBrowser e, no código, no evento FormRegionShowing, colocar o seguinte código:

private void MapaRegion_FormRegionShowing(object sender, System.EventArgs e)
{
    ContactItem c = this.OutlookItem as ContactItem;
    if (c == null)
        return;
    string end = c.BusinessAddressStreet + ", " +
        c.BusinessAddressCity + ", " + c.BusinessAddressCountry;
    webBrowser1.Navigate("http://maps.live.com/default.aspx?where1=" +
        Uri.EscapeUriString(end));
}

Quando executamos este programa, aparece um novo botão quando mostramos o contato (Figura 12). Clicando no botão, o mapa do endereço é mostrado na janela do Outlook (Figura 13).

Figura 12 – Janela do contato com novo botão

Figura 12 – Janela do contato com novo botão

Figura 13 – Mapa com endereço do contato

Figura 13 – Mapa com endereço do contato

Início da Página

Distribuindo os add-ins

Uma vez criado o add-in, devemos distribuí-lo para que os usuários possam usá-lo. Um add-in de documento deve ser distribuído com o documento. Os add-ins de aplicação e Form Regions, devem ser instalados pelo usuário.

Podemos usar o ClickOnce para criar a instalação para os dois tipos de projeto. Vá para as opções de projeto e selecione a aba Publish. Ali, deixe as escolhas padrão e selecione o botão Publish Now. Uma instalação ClickOnce será gerada no diretório Publish.  No caso de um add-in de documento, ao abrir o documento, o add-in será instalado e executado. Para add-ins de aplicação, deve-se executar o arquivo Setup.exe para instalar os add-ins.

Desinstalando os add-ins

A desinstalação de um add-in instalado pelo usuário é feito de maneira tradicional, removendo-o no painel de controle, usando a desinstalação de programas. Para o ambiente de desenvolvimento, basta ir no Solution Explorer, dar um clique com o botão direito do mouse e selecione a opção Clean. Outra maneira de desinstalar o add-in é abrindo a aplicação, indo para suas opções (Botão Office/Opções) e selecionando Suplementos. Deve-se selecionar Suplementos de Com e clicar no botão Ir e desinstalar o add-in desejado.

Início da Página

Conclusões

Como vimos, a criação de add-ins para as aplicações Office é muito simples. Com um modelo de programação semelhante ao usado em desenvolvimento em Windows Forms, podemos criar extensões que acessam nossas bases de dados e trazem maior funcionalidade às aplicações. Sem dúvida nenhuma, as aplicações Office são aquelas que o usuário tem maior familiaridade e, trazendo os dados do negócio às aplicações do Office facilita o uso e minimiza as necessidades de treinamento dos usuários.

Sobre o Autor

Bruno Sonnino é um consultor independente e desenvolvedor Windows Desktop usando as tecnologias Win32, WinForms e WPF, com mais de 20 anos de experiência.
Ele é o autor de 5 livros publicados em Português pela editora Pearson Education Brazil e escreve artigos para revistas brasileiras e americanas, tendo escrito mais de 20 utilitários para PcMag.com.
Blog: http://msmvps.com/blogs/bsonnino/default.aspx

Início da Página