Como incorporar e automatizar a folha de cálculo Microsoft Excel com MFC

Traduções de Artigos Traduções de Artigos
Artigo: 184663 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Sumário

Este artigo descreve como incorporar o Microsoft Excel folha de cálculo para um objecto de vista numa aplicação MFC SDI.

Este artigo inclui instruções passo a passo para incorporar a folha de cálculo e adicionar texto a célula A1, bem como comentários explicando cada passo.

Apesar do código de exemplo deste artigo pode ser retirado e colocar na sua aplicação, a vantagem real provêm de ler e compreender o exemplo código .

Mais Informação

A Microsoft fornece exemplos de programação apenas, para fins sem garantia expressa ou implícita. Isto inclui, mas não está limitado a, as garantias implícitas de comercialização ou adequação a um fim específico. Este artigo pressupõe que está familiarizado com a linguagem de programação apresentada e as ferramentas que são utilizadas para criar e depurar procedimentos. Os técnicos de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento. No entanto, não modificarão estes exemplos para proporcionarem funcionalidades adicionais nem criarão procedimentos adaptados às necessidades específicas do utilizador.

Para criar a aplicação MFC, siga estes passos:
  1. Utilizar o AppWizard para criar um novo MFC AppWizard (EXE) projecto com o nome "Embed_Excel."
  2. Seleccione um documento como o tipo de aplicação para criar e, seleccione o contentor como o tipo de suporte de documento composto para incluir. Aceite todas as outras predefinições.

    As seguintes classes geradas:

    aplicação : CEmbed_ExcelApp Embed_Excel.h e Embed_Excel.cpp

    moldura : CMainFrame MainFrm.h e MainFrm.cpp

    documento : CEmbed_ExcelDoc Embed_ExcelDoc.h e Embed_ExcelDoc.cpp

    vista : CEmbed_ExcelView Embed_ExcelView.h e Embed_ExcelView.cpp

    item de contentor : CEmbed_ExcelCntrItem CntrItem.h e CntrItem.cpp
  3. No menu Ver , clique em ClassWizard . Clique no separador automatização , clique em Adicionar classe e seleccionar a partir de uma biblioteca de tipos . Localize a biblioteca de tipos Microsoft Excel e adicionar todas as classes na biblioteca de tipos ao projecto. Para o Excel 97, a biblioteca de tipos está localizada na Excel8.olb. Para o Excel 2000 a biblioteca de tipos está localizada na Excel9.olb, e para o Excel 2002 e posterior, a biblioteca de tipos localizado no ficheiro Excel.exe.
  4. Adicione a seguinte linha para CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Em seguida, adicione o método GetIDispatch para CntrItem.cpp:
       Sample Code
       -----------
    
    
          /*******************************************************************
          *   This method returns the IDispatch* for the application linked to
          *   this container.
          ********************************************************************/ 
          LPDISPATCH CEmbed_ExcelCntrItem::GetIDispatch()
          {
             //The this and m_lpObject pointers must be valid for this function
             //to work correctly. The m_lpObject is the IUnknown pointer to
             // this object.
             ASSERT_VALID(this);
    
             ASSERT(m_lpObject != NULL);
    
             LPUNKNOWN lpUnk = m_lpObject;
    
             //The embedded application must be running in order for the rest
             //of the function to work.
             Run();
    
             //QI for the IOleLink interface of m_lpObject.
             LPOLELINK lpOleLink = NULL;
             if (m_lpObject->QueryInterface(IID_IOleLink,
                (LPVOID FAR*)&lpOleLink) == NOERROR)
             {
                ASSERT(lpOleLink != NULL);
                lpUnk = NULL;
    
                //Retrieve the IUnknown interface to the linked application.
                if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
                {
                   TRACE0("Warning: Link is not connected!\n");
                   lpOleLink->Release();
                   return NULL;
                }
                ASSERT(lpUnk != NULL);
             }
    
             //QI for the IDispatch interface of the linked application.
             LPDISPATCH lpDispatch = NULL;
             if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID FAR*)&lpDispatch)
                !=NOERROR)
             {
                TRACE0("Warning: does not support IDispatch!\n");
                return NULL;
             }
    
             //After assuring ourselves it is valid, return the IDispatch
             //interface to the caller.
             ASSERT(lpDispatch != NULL);
             return lpDispatch;
          }
    					
  6. Adicione a seguinte linha para Embed_ExcelView.h:
          void EmbedAutomateExcel();
    					
  7. Em seguida, adicione o método EmbedAutomateExcel para Embed_ExcelView.cpp:
    Sample Code
    -----------
          /********************************************************************
          *   This method encapsulates the process of embedding an Excel
          *   Worksheet in a View object and automating that worksheet to add
          *   some text to cell A1.
          ********************************************************************/ 
          void CEmbed_ExcelView::EmbedAutomateExcel()
          {
             //Change the cursor so the user knows something exciting is going
             //on.
             BeginWaitCursor();
    
             CEmbed_ExcelCntrItem* pItem = NULL;
             TRY
             {
                //Get the document associated with this view, and be sure it's
                //valid.
                CEmbed_ExcelDoc* pDoc = GetDocument();
                ASSERT_VALID(pDoc);
    
                //Create a new item associated with this document, and be sure
                //it's valid.
                pItem = new CEmbed_ExcelCntrItem(pDoc);
                ASSERT_VALID(pItem);
    
                // Get Class ID for Excel sheet.
                // This is used in creation.
                CLSID clsid;
                if(FAILED(::CLSIDFromProgID(L"Excel.sheet",&clsid)))
                   //Any exception will do. We just need to break out of the
                   //TRY statement.
                   AfxThrowMemoryException();
    
                // Create the Excel embedded item.
                if(!pItem->CreateNewItem(clsid))
                   //Any exception will do. We just need to break out of the
                   //TRY statement.
                   AfxThrowMemoryException();
    
                //Make sure the new CContainerItem is valid.
                ASSERT_VALID(pItem);
    
                // Launch the server to edit the item.
                pItem->DoVerb(OLEIVERB_SHOW, this);
    
    
                // As an arbitrary user interface design, this sets the
                // selection to the last item inserted.
                m_pSelection = pItem;   // set selection to last inserted item
                pDoc->UpdateAllViews(NULL);
    
                //Query for the dispatch pointer for the embedded object. In
                //this case, this is the Excel worksheet.
                LPDISPATCH lpDisp;
                lpDisp = pItem->GetIDispatch();
    
                //Add text in cell A1 of the embedded Excel sheet
                _Workbook wb;
                Worksheets wsSet;
                _Worksheet ws;
                Range range;
                _Application app;
    
                //set _Workbook wb to use lpDisp, the IDispatch* of the
                //actual workbook.
                wb.AttachDispatch(lpDisp);
    
    
                //Then get the worksheet's application.
                app = wb.GetApplication();
    
                //Then get the first worksheet in the workbook
                wsSet = wb.GetWorksheets();
                ws = wsSet.GetItem(COleVariant((short)1));
    
                //From there, get a Range object corresponding to cell A1.
                range = ws.GetRange(COleVariant("A1"), COleVariant("A1"));
    
                //Fill A1 with the string "Hello, World!"
                range.SetValue(COleVariant("Hello, World!"));
    
               //NOTE: If you are automating Excel 2002, the Range.SetValue method has an 
               //additional optional parameter specifying the data type.  Because the 
               //parameter is optional, existing code will still work correctly, but new 
               //code should use the new convention.  The call for Excel2002 should look 
               //like the following:
    
               //range.SetValue( C<?xm-insertion_mark_start author="v-thomr" time="20070326T121607-0600"?>O<?xm-insertion_mark_end?><?xm-deletion_mark author="v-thomr" time="20070326T121606-0600" data="o"?>leVariant( (long)DISP_E_PARAMNOTFOUND, VT_ERROR ), 
               //                COleVariant("Hello, World!"));
             }
    
               //Here, we need to do clean up if something went wrong.
               CATCH(CException, e)
               {
                  if (pItem != NULL)
                  {
                     ASSERT_VALID(pItem);
                     pItem->Delete();
    
                  }
                  AfxMessageBox(IDP_FAILED_TO_CREATE);
               }
               END_CATCH
    
               //Set the cursor back to normal so the user knows exciting stuff
               //is no longer happening.
               EndWaitCursor();
            }
    
    					
  8. Adicione a seguinte linha para Embed_ExcelView.h:
          #include "excel8.h"
    						
    N ote se estiver a automatizar o Excel 2000, o ficheiro de cabeçalho é "excel9.h." Se estiver a automatizar o Excel 2002 ou uma versão posterior do Excel, o ficheiro de cabeçalho é "excel.h."
  9. Observe o método OnInsertObject() da classe ver. É interessante note que este método e o método que acabou de escrever, são notavelmente semelhantes. Na realidade, o código que escreveu é apenas um especial caso de OnInsertObject(), que permite ao utilizador seleccionar de uma lista de OLE disponível objectos para inserir a aplicação. Porque apenas pretendemos automatizar a folha de cálculo do Excel, é substituir este comportamento. Para a aplicação, remova todo o código do interior de InsertObject() e substitua-através de uma chamada para EmbedAutomateExcel().
  10. Compilar e executar a aplicação.
  11. No menu Editar , clique em Inserir novo objecto .
Resultados: Folha de cálculo Microsoft Excel está incorporada para a vista. Além disso, a célula A1 é povoada com "Hello, World!" através de automatização.

Propriedades

Artigo: 184663 - Última revisão: 28 de março de 2007 - Revisão: 5.1
A informação contida neste artigo aplica-se a:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Foundation Class Library 4.2
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
Palavras-chave: 
kbmt kbprogramming kbautomation kbhowto kbinterop KB184663 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 184663

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com