Comment faire pour incorporer et automatiser une feuille de calcul Microsoft Excel avec MFC

Traductions disponibles Traductions disponibles
Numéro d'article: 184663 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Résumé

Cet article décrit comment intégrer une feuille de calcul Microsoft Excel dans un objet Vue dans une application SDI MFC.

Cet article fournit des instructions étapes par étapes pour intégrer la feuille de calcul et ajouter du texte à la cellule A1, ainsi que des commentaires expliquant chaque étape.

Bien que le code exemple donné dans cet article puisse être pris et utilisé dans votre application, le véritable bénéfice vient de la lecture et de la compréhension de l'exemple.

Plus d'informations

Voici les étapes pour créer l'application MFC :
  1. Utiliser AppWizard pour créer un nouveau projet MFC AppWizard (EXE) nommé "Embed_Excel".
  2. Sélectionner Mono document comme type d'application à créer, et sélectionnez Conteneur comme prise en charge des documents composés à inclure. Acceptez tous les autres paramètres par défaut.

    Les classes suivantes sont générées :

    Application : CEmbed_ExcelApp dans Embed_Excel.h et Embed_Excel.cpp

    Trame : CMainFrame dans MainFrm.h et MainFrm.cpp

    Document : CEmbed_ExcelDoc dans Embed_ExcelDoc.h et Embed_ExcelDoc.cpp

    Vue : CEmbed_ExcelView dans Embed_ExcelView.h et Embed_ExcelView.cpp

    Élément de conteneur : CEmbed_ExcelCntrItem dans CntrItem.h et CntrItem.cpp
  3. Dans le menu Affichage, cliquez sur ClassWizard. Cliquez sur l'onglet Automation, cliquez sur Ajouter une classe, et choisissez À partir d'une bibliothèque de types. Recherchez la bibliothèque de types Microsoft Excel et ajoutez toutes les classes de la bibliothèque de types à votre projet. Pour Excel 97, la bibliothèque de types est située dans Excel8.olb. Pour Excel 2000 la bibliothèque de types est située dans Excel9.olb, et pour Excel 2002, la bibliothèque de types est située dans Excel.exe.
  4. Ajoutez la ligne suivante à CntrItem.h :
    LPDISPATCH GetIDispatch();
    					
  5. Puis ajoutez la méthode 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. Ajoutez la ligne suivante à Embed_ExcelView.h :
          void EmbedAutomateExcel();
    					
  7. Puis ajoutez la méthode 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( ColeVariant( (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. Ajoutez la ligne suivante à Embed_ExcelView.h :
          #include "excel8.h"
    						
    REMARQUE : Si vous automatisez Excel 2000, le fichier d'en-tête est "excel9.h". Si vous automatisez Excel 2002, le fichier d'en-tête est "excel.h".
  9. Observez la méthode OnInsertObject() de la classe Vue. Il est intéressant de noter que cette méthode, et la méthode que nous venons d'écrire, sont étonnamment similaires. En fait, le code que nous venons d'écrire est simplement un cas particulier de OnInsertObject(), qui permet à l'utilisateur de sélectionner parmi une liste d'objets OLE disponibles à insérer dans l'application. Comme nous voulons uniquement automatiser la feuille de calcul Excel, nous remplaçons ce comportement. Pour notre application, éliminez tout le code à partir de l'intérieur de InsertObject() et remplacez-le par un appel à EmbedAutomateExcel().
  10. Compilez et exécutez l'application.
  11. Dans le menu Edition, cliquez sur Insérer un nouvel objet. RÉSULTATS : Une feuille de calcul Microsoft Excel est intégrée dans la Vue; en outre, par l'automation, le contenu de la cellule A1 comprend "Hello, World!"

Propriétés

Numéro d'article: 184663 - Dernière mise à jour: mercredi 26 octobre 2005 - Version: 4.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Excel 2000 Standard
  • Microsoft Visual C++ 5.0 Édition Professionnelle
  • Microsoft Visual C++ 6.0 Édition Professionnelle
  • Microsoft Foundation Class Library 4.2
  • Microsoft Office XP Developer
  • Microsoft Office 2000 Developer
  • Microsoft Excel 2002
  • Microsoft Excel 97 Standard
Mots-clés : 
kbhowto kbinterop kbprogramming kbautomation KB184663
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

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