Como incorporar e automatizar uma planilha do Microsoft Excel com MFC

Traduções deste artigo Traduções deste artigo
ID do artigo: 184663 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Sumário

Este artigo descreve como incorporar um arquivo do Microsoft Excel Worksheet em um objeto View em um aplicativo MFC SDI.

Este artigo inclui instruções passo a passo para incorporar a planilha e adicionar texto à célula, bem como comentários explicando cada etapa.

Embora o código de exemplo deste artigo pode ser executado e colocar em seu aplicativo, vem o benefício real de ler e compreender o exemplo código .

Mais Informações

Microsoft fornece exemplos de programação apenas para ilustração, sem garantia expressa ou implícita. Isso inclui, mas não está limitado a, garantias implícitas de comercialização ou adequação para uma finalidade específica. Este artigo presume que você está familiarizados com a linguagem de programação que está sendo demonstrada e com as ferramentas que são usadas para criar e depurar procedimentos. Engenheiros de suporte podem ajudar a explicar a funcionalidade de um determinado procedimento. No entanto, eles não modificarão esses exemplos para fornecer funcionalidades adicionais ou construir procedimentos para atender às suas necessidades.

Para criar o aplicativo MFC, execute essas etapas:
  1. Use o AppWizard para criar um novo MFC AppWizard (EXE) projeto chamado "Embed_Excel."
  2. Selecione documento único como o tipo de aplicativo para criar e selecione o recipiente como o tipo de documento composto suporte para incluir. Aceite todas as outras configurações padrão.

    As classes a seguir são geradas:

    aplicativo : CEmbed_ExcelApp em Embed_Excel.h e Embed_Excel.cpp

    quadro : CMainFrame em MainFrm.h e MainFrm.cpp

    documento : CEmbed_ExcelDoc em Embed_ExcelDoc.h e Embed_ExcelDoc.cpp

    modo de exibição : CEmbed_ExcelView em Embed_ExcelView.h e Embed_ExcelView.cpp

    item de recipiente : CEmbed_ExcelCntrItem em CntrItem.h e CntrItem.cpp
  3. No menu Exibir , clique em ClassWizard . Clique na guia de automação , clique em Add Class e escolha De uma biblioteca de tipos . Localize a biblioteca de tipos Microsoft Excel , e adicione todas as classes na biblioteca de tipos para seu projeto. 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 Excel.exe.
  4. Adicione a seguinte linha para CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Em seguida, adicione o método GetIDispatch 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 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 você estiver automatizando o Excel 2000, o arquivo de cabeçalho é "excel9.h." Se você estiver automatizando o Excel 2002 ou uma versão posterior do Excel, o arquivo de cabeçalho é "excel.h."
  9. Examinar o método OnInsertObject() da classe View. É interessante observar que esse método e o método que apenas escrevemos, são bastante semelhantes. Na verdade, o código que escrevemos é simplesmente um especial objetos de caso de OnInsertObject(), que permite ao usuário selecionar em uma lista de OLE disponível para inserir o aplicativo. Como queremos apenas automatizar a planilha do Excel, podemos substituir esse comportamento. Em nosso aplicativo, remover todo o código do interior do InsertObject() e substituí-lo com uma chamada para EmbedAutomateExcel().
  10. Compilar e executar o aplicativo.
  11. No menu Editar , clique em Inserir novo objeto .
Resultados: Uma planilha do Microsoft Excel é incorporada para o modo de exibição. Além disso, a célula é preenchida com "Hello, World!" por meio de automação.

Propriedades

ID do artigo: 184663 - Última revisão: quarta-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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