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

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

Resumo

Poderá querer apresentar ou incorporar um documento do Microsoft Office diretamente num formulário do Microsoft Visual C#. O Microsoft Visual C# 2005 e o Microsoft Visual C# .NET não fornecem um controlo OLE que lhe permite incorporar um documento do Office num formulário. Se pretender incorporar um documento existente e abri-lo como um objeto de documento ActiveX no local num formulário Visual C#, uma possível solução para si é utilizar o controlo do Microsoft WebBrowser.

Este artigo demonstra como procurar um documento existente do Office e como o apresentar dentro de um formulário Visual C# ao utilizar o controlo WebBrowser.

Mais Informações

Os documentos ActiveX são objetos OLE incorporados que se comportam mais como controlos ActiveX do que objetos OLE tradicionais. Ao contrário de um objeto tradicional incorporado, um documento ActiveX não foi concebido para ser um objeto contido num documento maior. Em vez disso, é considerado, por si só, um documento completo que está apenas a ser visto (como com o Microsoft Internet Explorer) ou a ser recolhido num único recurso com outros documentos (como um ficheiro do Microsoft Office Binder). Um documento ActiveX aloado no controlo WebBrowser está sempre ativo; portanto, ao contrário dos objetos OLE tradicionais incorporados, não há noção da ativação no local.

Apesar de o Visual C# 2005 e o Visual C# .NET não suportarem atualmente o alojo de documentos ActiveX diretamente, pode utilizar o controlo WebBrowser para esta finalidade. O controlo WebBrowser (Shdocvw.dll) faz parte do Internet Explorer e só pode ser utilizado em sistemas com o Internet Explorer instalado.

Criar uma aplicação Visual C# que abre documentos do Office

Para criar uma aplicação Visual C# que abra documentos do Office, siga estes passos:

  1. Crie um novo projeto de Aplicação do Windows no Visual C# 2005 ou no Visual C# .NET. O formulário1 é criado por predefinição.

    Nota No Visual C# 2005, se não conseguir encontrar o ficheiro SHDocVw.dll ou o ficheiro AxSHDocVw.dll, execute o seguinte comando na lista de comandos do Visual Studio:

    aximp %WINDIR%\system32\shdocvw.dll
    

    Em seguida, crie um proxy de runtime de SHDocVw.dll idioma comum e um proxy Windows Forms (AxSHDocVw.dll) para o controlo do Browser Microsoft. Para adicionar os ficheiros DLL no Visual C# 2005, siga estes passos:

    1. No menu Projeto , clique em Adicionar Referência.
    2. Na caixa de diálogo Adicionar Referência, clique em Procurar.
    3. Localize e, em seguida, selecione o AxSHDocVw.dll e o SHDocVw.dll ficheiro.
    4. Para adicionar referências de projeto a estes dois ficheiros, clique em OK.
  2. No menu Ferramentas, clique em Personalizar Caixa de Ferramentas para abrir a caixa de diálogo Personalizar Caixa de Ferramentas. No separador Componentes COM, adicione uma referência ao Microsoft WebBrowser. Clique em OK para adicionar o controlo WebBrowser à Windows Forms de ferramentas. O controlo WebBrowser aparece com o Explorador de Texto na caixa de ferramentas.

    Nota No Visual Studio 2005, não tem de fazer o passo 2.

  3. Ao utilizar a caixa de ferramentas, adicione um controlo WebBrowser, um controlo OpenFileDialog e um controlo CommandButton ao Formulário1. Esta ação adiciona as variáveis de membro AxWebrowser1, OpenFileDialog1 e Button1 à classe Formulário1. No Visual C# 2005, são adicionadas as variáveis de membro webBrowser1, openFileDialog1 e button1.

  4. No Formulário1, faça duplo clique em Botão1. Esta ação adiciona o Button1_Click evento ao Formulário1.

  5. Na janela de código do Formulário1, adicione o seguinte espaço de nomes à lista:

    using System.Reflection;
    
  6. Defina um membro privado no formulário1 da turma da seguinte forma:

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

    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. Substituir o seguinte código

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

    com:

    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 Tem de alterar o código no Visual Studio 2005. Por predefinição, o Visual C# adiciona um formulário ao projeto quando cria um Windows Forms projeto. O formulário tem o nome Formulário1. Os dois ficheiros que representam o formulário são denominados Formulário1.cs e Form1.designer.cs. O código é escrito no Formulário1.cs. O ficheiro Form1.designer.cs é onde o Estruturador do Windows Forms escreve o código que implementa todas as ações que efetuou ao arrastar e largar controlos da Caixa de Ferramentas.

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

  9. Prima F5 para executar o projeto. Quando clica em Procurar, a caixa de diálogo Abrir é exibida e permite-lhe procurar um documento do Word, uma livro do Excel ou uma apresentação do PowerPoint. Selecione um ficheiro e, em seguida, clique em Abrir. O documento é aberto dentro do controlo WebBrowser e é apresentada uma caixa de mensagem que apresenta o nome do servidor de documentos do Office.

O que ter em conta quando utilizar o controlo WebBrowser

Deve ter em consideração o seguinte quando utilizar o controlo WebBrowser:

  • O controlo WebBrowser navega para documentos assíncronamente. Quando liga para WebBrowser1.Navigate, a chamada devolve o controlo à sua aplicação Visual C# antes de o documento ter sido completamente carregado. Se planeia automatizar o documento contido, tem de utilizar o evento NavegarCompleto2 para ser notificado quando o documento terminar de carregar. Utilize a propriedade Documento do objeto WebBrowser transmitido para obter uma referência ao objeto de documento do Office que, no código anterior, está definido como oDocument.

  • O controlo WebBrowser não suporta a ressarcimento de menus.

  • No Internet Explorer versões 5.0 e posteriores, pode apresentar barras de ferramentas da dock com 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);
    
  • Existem vários problemas conhecidos de ter mais do que um controlo do WebBrowser num projeto e de ter cada controlo carregado com o mesmo tipo de documento do Office (ou seja, todos os documentos do Word ou todas as páginas de trabalho do Excel). A Microsoft recomenda que utilize apenas um controlo para cada projeto e navegue para um documento de cada vez.

    O problema mais comum está nas barras de comando do Microsoft Office, que aparecem desativadas. Se tiver dois controlos do WebBrowser no mesmo formulário, ambos carregados com documentos do Word e se tiver apresentado barras de ferramentas ao utilizar uma das técnicas anteriores, apenas um conjunto de barras de ferramentas está ativo e funciona corretamente. O outro está desativado e não pode ser utilizado.

  • Para limpar o controlo do WebBrowser dos seus conteúdos atuais, no evento Click de outro botão de comando (ou noutro local adequado no seu código), navegue para a página em branco predefinida utilizando o seguinte código:

       AxWebBrowser1.Navigate("about:blank");
    

O que considerar quando utilizar o controlo WebBrowser juntamente com um programa do Microsoft Office 2007

Por predefinição, os programas do Office 2007 não abrem documentos do Office no browser. Este comportamento também afeta o controlo do WebBrowser. Recomendamos que utilize um contentor de documentos ActiveX personalizado em vez do controlo WebBrowser quando desenvolver aplicações que abram documentos do Office 2007.

Para aplicações existentes que necessitem de retrocompatibilidade com o controlo WebBrowser, pode modificar o registo para configurar o Internet Explorer. Pode utilizar este método para configurar o Internet Explorer para abrir documentos do Office 2007 no browser. Para obter mais informações, clique no seguinte número de artigo para ver o artigo na Base de Dados de Conhecimento Microsoft:

927009 É aberta uma nova janela quando tenta ver um documento do programa do Microsoft Office 2007 no Windows Internet Explorer 7

Nota

Se modificar o registo utilizando o método mencionado no artigo da Base de Dados de Conhecimento Microsoft 927009, as alterações afetam o controlo do WebBrowser que utiliza na aplicação. As alterações também afetam todas as instâncias do Internet Explorer. Além disso, este método poderá não funcionar em quaisquer versões futuras dos conjuntos de ativos do Microsoft Office. Por essa razão, recomendamos que utilize este método apenas para compatibilidade com uma aplicação existente.

Referências

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

  • 304562 Visual Studio 2005 e Visual Studio .NET não fornecem um controlo de contentor OLE para Windows Forms

  • 243058 Como utilizar o controlo WebBrowser para abrir um documento do Office

  • 927009 É aberta uma nova janela quando tenta ver um documento do programa do Microsoft Office 2007 no Windows Internet Explorer 7