Como usar o controle WebBrowser para abrir documentos do Office no Visual C# 2005 ou no .NET do Visual C#

Para obter uma versão do .NET do Microsoft Visual Basic deste artigo, consulte 304643.

Resumo

Talvez você queira exibir ou inserir um documento do Microsoft Office diretamente em um formulário do Microsoft Visual C#. O Microsoft Visual C# 2005 e o Microsoft Visual C# .NET não fornecem um controle OLE que permite inserir um documento do Office em um formulário. Se você quiser inserir um documento existente e abri-lo como um objeto de documento ActiveX in-loco em um formulário do Visual C#, uma possível solução é usar o controle Microsoft WebBrowser.

Este artigo demonstra como navegar até um documento existente do Office e como exibi-lo dentro de um formulário do Visual C# usando o controle WebBrowser.

Informações adicionais

Documentos ActiveX são objetos OLE inseríveis que se comportam mais como controles ActiveX do que objetos OLE tradicionais. Ao contrário de um objeto inserido tradicional, um documento ActiveX não foi projetado para ser um objeto contido em um documento maior. Em vez disso, ele é considerado em si um documento completo que está apenas sendo exibido (como com o Microsoft Internet Explorer) ou sendo coletado em um único recurso com outros documentos (como um arquivo do Microsoft Office Binder). Um documento ActiveX hospedado no controle WebBrowser está sempre ativo; portanto, ao contrário dos objetos inseridos OLE tradicionais, não há sentido de ativação in-loco.

Embora o Visual C# 2005 e o .NET do Visual C# não deem suporte à hospedagem de documentos ActiveX diretamente, você pode usar o controle WebBrowser para essa finalidade. O controle WebBrowser (Shdocvw.dll) faz parte do Internet Explorer e só pode ser usado em sistemas que têm o Internet Explorer instalado.

Criando um aplicativo do Visual C# que abre documentos do Office

Para criar um aplicativo do Visual C# que abre documentos do Office, siga estas etapas:

  1. Crie um novo projeto de aplicativo do Windows no Visual C# 2005 ou no Visual C# .NET. O Form1 é criado por padrão.

    Nota No Visual C# 2005, se você não conseguir localizar o arquivo SHDocVw.dll ou o arquivo AxSHDocVw.dll, execute o seguinte comando no prompt de comando do Visual Studio:

    aximp %WINDIR%\system32\shdocvw.dll
    

    Em seguida, crie um proxy do Common Language Runtime (SHDocVw.dll) e um proxy Windows Forms (AxSHDocVw.dll) para o controle microsoft Web Browser. Para adicionar os arquivos DLL no Visual C# 2005, siga estas etapas:

    1. On the Project menu, click Add Reference.
    2. In the Add Reference dialog box, click Browse.
    3. Localize e selecione o arquivo AxSHDocVw.dll e o SHDocVw.dll arquivo.
    4. Para adicionar referências de projeto para esses dois arquivos, clique em OK.
  2. No menu Ferramentas, clique em Personalizar Caixa de Ferramentas para abrir a caixa de diálogo Personalizar Caixa de Ferramentas. Na guia Componentes COM, adicione uma referência ao Microsoft WebBrowser. Clique em OK para adicionar o controle WebBrowser à Windows Forms de ferramentas. O controle WebBrowser aparece com o Gerenciador de texto na caixa de ferramentas.

    Nota No Visual Studio 2005, você não precisa realizar a etapa 2.

  3. Usando a caixa de ferramentas, adicione um controle WebBrowser, um controle OpenFileDialog e um controle CommandButton ao Form1. Isso adiciona as variáveis de membro AxWebBrowser1, OpenFileDialog1 e Button1 à classe Form1. No Visual C# 2005, as variáveis de membro webBrowser1, openFileDialog1 e button1 são adicionadas.

  4. No Form1, clique duas vezes em Button1. Isso adiciona o Button1_Click ao Form1.

  5. Na janela de código do Form1, adicione o seguinte namespace à lista:

    using System.Reflection;
    
  6. Defina um membro privado na classe Form1 da seguinte maneira:

    private Object oDocument;
    
  7. No final do método InitializeComponent da classe Form1, adicione o seguinte código para manipular os eventos Form1_Load, Form1_Closed e axWebBrowser1_NavigateComplete2:

    this.axWebBrowser1.NavigateComplete2 += new AxSHDocVw.DWebBrowserEvents2_NavigateComplete2EventHandler(this.axWebBrowser1_NavigateComplete2);
    this.Load += new System.EventHandler(this.Form1_Load);
    this.Closed += new System.EventHandler(this.Form1_Closed);
    
  8. Substitua o código a seguir

    private void button1_Click(object sender, System.EventArgs e)
    {
    }
    
    

    por:

    private void button1_Click(object sender, System.EventArgs e)
    {
    
    String  strFileName;
    
    //Find the Office document.
     openFileDialog1.FileName = "";
     openFileDialog1.ShowDialog();
     strFileName = openFileDialog1.FileName;
    
    //If the user does not cancel, open the document.
     if(strFileName.Length != 0)
     {
      Object refmissing = System.Reflection.Missing.Value;
      oDocument = null;
      axWebBrowser1.Navigate(strFileName, ref refmissing , ref refmissing , ref refmissing , ref refmissing);
     }
    }
    
    public void Form1_Load(object sender, System.EventArgs e)
    {
     button1.Text = "Browse";
     openFileDialog1.Filter = "Office Documents(*.doc, *.xls, *.ppt)|*.doc;*.xls;*.ppt" ;
     openFileDialog1.FilterIndex = 1;
    }
    
    public void Form1_Closed(object sender, System.EventArgs e)
    {
     oDocument = null;
    }
    
    public void axWebBrowser1_NavigateComplete2(object sender, AxSHDocVw.DWebBrowserEvents2_NavigateComplete2Event e)
    {
    
    //Note: You can use the reference to the document object to 
     //      automate the document server.
    
    Object o = e.pDisp;
    
    oDocument = o.GetType().InvokeMember("Document",BindingFlags.GetProperty,null,o,null);
    
    Object oApplication = o.GetType().InvokeMember("Application",BindingFlags.GetProperty,null,oDocument,null);
    
    Object oName = o.GetType().InvokeMember("Name",BindingFlags.GetProperty ,null,oApplication,null);
    
    MessageBox.Show("File opened by: " + oName.ToString() ); 
    }
    
    

    Nota Você deve alterar o código no Visual Studio 2005. Por padrão, o Visual C# adiciona um formulário ao projeto quando você cria um Windows Forms projeto. O formulário é denominado Form1. Os dois arquivos que representam o formulário são chamados Form1.cs e Form1.designer.cs. Você escreve o código em Form1.cs. O arquivo Form1.designer.cs é onde o designer Windows Forms grava o código que implementa todas as ações executadas arrastando e soltando controles da Caixa de Ferramentas.

    Para obter mais informações sobre o designer Windows Forms no Visual C# 2005, visite o seguinte site do MSDN (Microsoft Developer Network):https://msdn.microsoft.com/en-us/library/ms173077.aspx

  9. Pressione F5 para executar o projeto. Quando você clica em Procurar, a caixa de diálogo Abrir é exibida e permite que você navegue até um documento do Word, uma planilha do Excel ou uma apresentação do PowerPoint. Selecione qualquer arquivo e clique em Abrir. O documento é aberto dentro do controle WebBrowser e uma caixa de mensagem que exibe o nome do servidor de documentos do Office é exibida.

O que considerar ao usar o controle WebBrowser

Você deve considerar o seguinte ao usar o controle WebBrowser:

  • O controle WebBrowser navega para documentos de forma assíncrona. Quando você chama WebBrowser1.Navigate, a chamada retorna o controle para o aplicativo Visual C# antes que o documento seja completamente carregado. Se você planeja automatizar o documento contido, precisará usar o evento NavigateComplete2 para ser notificado quando o documento terminar de carregar. Use a propriedade Document do objeto WebBrowser que é passado para obter uma referência ao objeto de documento do Office, que, no código anterior, está definido como oDocument.

  • O controle WebBrowser não dá suporte à mesclagem de menus.

  • No Internet Explorer versões 5.0 e posteriores, você pode exibir barras de ferramentas encaixadas usando o seguinte código:

     // This is a toggle option, so call it once to show the 
     // toolbars and once to hide them. This works with Internet Explorer 5
     // but often fails to work properly with earlier versions.
    
    Object refmissing = System.Reflection.Missing.Value;
     axWebBrowser1.ExecWB(SHDocVw.OLECMDID.OLECMDID_HIDETOOLBARS, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,ref refmissing , ref refmissing);
    
  • Há vários problemas conhecidos em ter mais de um controle WebBrowser em um projeto e ter cada controle carregado com o mesmo tipo de documento do Office (ou seja, todos os documentos do Word ou todas as planilhas do Excel). A Microsoft recomenda que você use apenas um controle para cada projeto e navegue até um documento por vez.

    O problema mais comum é com as barras de comandos do Microsoft Office, que aparecem desabilitadas. Se você tiver dois controles WebBrowser no mesmo formulário, ambos carregados com documentos do Word e se você tiver exibido barras de ferramentas usando uma das técnicas anteriores, apenas um conjunto de barras de ferramentas estará ativo e funcionará corretamente. O outro está desabilitado e não pode ser usado.

  • Para limpar o controle WebBrowser de seu conteúdo atual, no evento Click de outro botão de comando (ou em algum outro local apropriado em seu código), navegue até a página em branco padrão usando o seguinte código:

       AxWebBrowser1.Navigate("about:blank");
    

O que considerar ao usar o controle WebBrowser junto com um programa do Microsoft Office 2007

Por padrão, os programas do Office 2007 não abrem documentos do Office no navegador da Web. Esse comportamento também afeta o controle WebBrowser. Recomendamos que você use um contêiner de documentos ActiveX personalizado em vez do controle WebBrowser ao desenvolver aplicativos que abrem documentos do Office 2007.

Para aplicativos existentes que exigem compatibilidade com versões anteriores com o controle WebBrowser, você pode modificar o registro para configurar o Internet Explorer. Você pode usar esse método para configurar o Internet Explorer para abrir documentos do Office 2007 no navegador da Web. Para obter mais informações, clique no seguinte número de artigo para exibir o artigo na Base de Dados de Conhecimento Microsoft:

927009 uma nova janela é aberta quando você tenta exibir um documento de programa do Microsoft Office 2007 no Windows Internet Explorer 7

Observação

Se você modificar o registro usando o método mencionado no artigo da Base de Dados de Conhecimento microsoft 927009, as alterações afetarão o controle WebBrowser que você usa no aplicativo. As alterações também afetam todas as instâncias do Internet Explorer. Além disso, esse método pode não funcionar para nenhuma versão futura dos pacotes do Microsoft Office. Portanto, recomendamos que você use esse método somente para compatibilidade com um aplicativo existente.

Referências

Para obter mais informações sobre como usar o controle WebBrowser, clique nos seguintes números de artigo para exibir os artigos na Base de Dados de Conhecimento Microsoft:

  • 304562 Visual Studio 2005 e Visual Studio .NET não fornecem um controle de contêiner OLE para Windows Forms

  • 243058 como usar o controle WebBrowser para abrir um documento do Office

  • 927009 uma nova janela é aberta quando você tenta exibir um documento de programa do Microsoft Office 2007 no Windows Internet Explorer 7