Comment faire pour utiliser MFC pour automatiser Excel, créer et mettre en forme un nouveau classeur

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

Sommaire

Résumé

Cet article indique comment automatiser Microsoft Excel à l'aide de la bibliothèque MFC (Microsoft Foundation Class), version 4.2 (installée avec Microsoft Visual C++ versions 5.0 et 6.0).

L'article décrit une technique d'utilisation de l'automation OLE pour créer/mettre en forme un classeur Microsoft Excel ; il introduit plusieurs méthodes/propriétés (de la bibliothèque de types Microsoft Excel) pour ajouter des données à la feuille de calcul et mettre en forme cette dernière.

Remarques pour automatiser Microsoft Excel 2000 et 2002

L'exemple de code de cet article utilise des wrappers de classe générés à partir de la bibliothèque d'objets Excel 97 (Excel 8.olb). Sous réserve de légères modifications, ce code peut être appliqué à un client Automation qui utilise les wrappers de classe pour Excel 2000 (Excel9.olb) ou Excel 2002 (Excel.olb). Pour plus d'informations sur l'utilisation du code exemple décrit dans cet article avec la bibliothèque de types Microsoft Excel 2000 ou 2002, veuillez cliquer sur le numéro d'article ci-dessous pour le consulter dans la Base de connaissances Microsoft :
224925 INFO : Les bibliothèques de types pour Office peuvent changer avec la nouvelle version

Plus d'informations

Vous pouvez copier le code dans cet article vers la fonction de gestionnaire des messages d'un événement défini dans un fichier .cpp MFC. Toutefois, l'objectif de ce code est d'illustrer le processus d'utilisation des interfaces IDispatch et des fonctions de membres définies dans la bibliothèque de types Excel8.olb. Le principal avantage de cet article, toutefois, vient de la lecture et de la compréhension du code dans l'exemple de façon à ce que vous puissiez modifier l'exemple ou écrire votre propre code en vue d'automatiser Microsoft Excel 97 à l'aide de MFC.

Étapes pour créer le projet

  1. Appliquez les étapes 1 à 12 de l'article suivant de la Base de connaissances Microsoft pour créer un exemple de projet qui utilise les interfaces IDispatch et les fonctions membres définies dans la bibliothèque de types Excel8.olb :
    Comment faire pour créer un projet d'automation à l'aide de MFC et une bibliothèque de types
  2. En haut du fichier AutoProjectDlg.cpp, ajoutez la ligne suivante :
          #include "excel8.h"
    					
  3. Ajoutez le code suivant à CAutoProjectDlg::OnRun () dans le fichier AutoProjectDLG.cpp :

    Exemple de code

          // Commonly used OLE variants.
          COleVariant
                     covTrue((short)TRUE),
                     covFalse((short)FALSE),
                     covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
    
          _Application app;
          Workbooks books;
          _Workbook book;
    
          Worksheets sheets;
          _Worksheet sheet;
          Range range;
          Font font;
          Range cols;
    
          // Start Excel and get Application object.
    
          if(!app.CreateDispatch("Excel.Application"))
          {
           AfxMessageBox("Couldn't start Excel and get Application object.");
           return;
          }
    
    
          //Get a new workbook.
          books = app.GetWorkbooks();
          book = books.Add (covOptional);
    
          //Get the first sheet.
          sheets =book.GetSheets();
          sheet = sheets.GetItem(COleVariant((short)1));
    
          //Fill cells A1, B1, C1, and D1 one cell at a time with "headers".
          range = sheet.GetRange(COleVariant("A1"),COleVariant("A1"));
          range.SetValue(COleVariant("First Name"));
          range = sheet.GetRange(COleVariant("B1"),COleVariant("B1"));
          range.SetValue(COleVariant("Last Name"));
          range = sheet.GetRange(COleVariant("C1"),COleVariant("C1"));
          range.SetValue(COleVariant("Full Name"));
          range = sheet.GetRange(COleVariant("D1"),COleVariant("D1"));
          range.SetValue(COleVariant("Salary"));
    
    
          //Format A1:D1 as bold, vertical alignment = center.
          range = sheet.GetRange(COleVariant("A1"), COleVariant("D1"));
          font = range.GetFont();
          font.SetBold(covTrue);
          range.SetVerticalAlignment(
                   COleVariant((short)-4108));   //xlVAlignCenter = -4108
    
          //Fill A2:B6 with an array of values (First & Last Names).
          {
             COleSafeArray saRet;
             DWORD numElements[]={5,2};   //5x2 element array
             saRet.Create(VT_BSTR, 2, numElements);
    
    
             //Fill the 5x2 SafeArray with the following data:
             //   John      Smith
             //   Tom       Brown
             //   Sue       Thomas
             //   Jane      Jones
             //   Adam      Johnson
    
             FillSafeArray(L"John", 0, 0, &saRet);
             FillSafeArray(L"Smith", 0, 1, &saRet);
             FillSafeArray(L"Tom", 1, 0, &saRet);
             FillSafeArray(L"Brown", 1, 1, &saRet);
             FillSafeArray(L"Sue", 2, 0, &saRet);
             FillSafeArray(L"Thomas", 2, 1, &saRet);
    
             FillSafeArray(L"Jane", 3, 0, &saRet);
             FillSafeArray(L"Jones", 3, 1, &saRet);
             FillSafeArray(L"Adam", 4, 0, &saRet);
             FillSafeArray(L"Johnson", 4, 1, &saRet);
    
             range = sheet.GetRange(COleVariant("A2"), COleVariant("B6"));
             range.SetValue(COleVariant(saRet));
    
             saRet.Detach();
          }
    
          //Fill C2:C6 with a relative formula (=A2 & " " & B2).
          range = sheet.GetRange(COleVariant("C2"), COleVariant("C6"));
          range.SetFormula(COleVariant("=A2 & \" \" & B2"));
    
          //Fill D2:D6 with a formula(=RAND()*100000) and apply a number
          //format.
          range = sheet.GetRange(COleVariant("D2"), COleVariant("D6"));
          range.SetFormula(COleVariant("=RAND()*100000"));
          range.SetNumberFormat(COleVariant("$0.00"));
    
          //AutoFit columns A:D.
          range = sheet.GetRange(COleVariant("A1"), COleVariant("D1"));
          cols = range.GetEntireColumn();
          cols.AutoFit();
    
          //Manipulate a variable number of columns for Quarterly Sales Data.
          {
             short NumQtrs;
             CString msg;
             Range resizedrange;
             Interior interior;
             Borders borders;
    
             //Determine how many quarters to display data for.
             for(NumQtrs=1;NumQtrs<=3;NumQtrs++)
             {
                msg.Format("Enter sales data for %d quarter(s)?", NumQtrs);
                if(AfxMessageBox(msg,MB_YESNO)==IDYES)
                {
                   break;
                }
             }
             msg.Format("Displaying data for %d quarters.", NumQtrs);
             AfxMessageBox(msg);
    
             //Starting at E1, fill headers for the number of columns selected.
             range = sheet.GetRange(COleVariant("E1"), COleVariant("E1"));
             resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));
             resizedrange.SetFormula(
                    COleVariant("=\"Q\" & COLUMN()-4 & CHAR(10) & \"Sales\""));
             //Change the Orientation and WrapText properties for the headers.
             resizedrange.SetOrientation(COleVariant((short)38));
             resizedrange.SetWrapText(covTrue);
             //Fill the interior color of the headers.
             interior = resizedrange.GetInterior();
             interior.SetColorIndex(COleVariant((short)36));
    
             //Fill the columns with a formula and apply a number format.
             range = sheet.GetRange(COleVariant("E2"), COleVariant("E6"));
             resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));
             resizedrange.SetFormula(COleVariant("=RAND()*100"));
             resizedrange.SetNumberFormat(COleVariant("$0.00"));
    
             //Apply borders to the Sales data and headers.
             range = sheet.GetRange(COleVariant("E1"), COleVariant("E6"));
             resizedrange= range.GetResize(covOptional, COleVariant(NumQtrs));
             borders = resizedrange.GetBorders();
             borders.SetWeight(COleVariant((short)2));   //xlThin = 2
    
             //Add a Totals formula for the Quarterly sales data and apply a
             //border.
             range = sheet.GetRange(COleVariant("E8"), COleVariant("E8"));
             resizedrange = range.GetResize(covOptional, COleVariant(NumQtrs));
             resizedrange.SetFormula(COleVariant("=SUM(E2:E6)"));
             borders = resizedrange.GetBorders();
             {
                Border bottomborder;
                bottomborder = borders.GetItem((long)9);
                bottomborder.SetLineStyle(
                               COleVariant((short)-4119));   //xlDouble = -4119
                bottomborder.SetWeight(
                               COleVariant((short)4));       //xlThick = 4
    
             }
          }
    
          //Make the application visible and give the user control of
          //Microsoft Excel.
          app.SetVisible(TRUE);
          app.SetUserControl(TRUE);
    					
  4. Ajoutez la fonction suivante à AutoProjectDLG.cpp, en la situant quelque part avant CAutoProjectDlg::OnRun():

    Code exemple

          void FillSafeArray(OLECHAR FAR* sz, int iRow, int iCol,
                             COleSafeArray* sa)
          {
    
             VARIANT v;
             long index[2];
    
             index[0] = iRow;
             index[1] = iCol;
    
             VariantInit(&v);
             v.vt = VT_BSTR;
             v.bstrVal = SysAllocString(sz);
             sa->PutElement(index, v.bstrVal);
             SysFreeString(v.bstrVal);
             VariantClear(&v);
    
          }
    					
  5. Dans Developer Studio, exécutez l'application. Lorsque la boîte de dialogue s'affiche (l'exemple crée une application basée sur les boîtes de dialogue), cliquez sur le bouton Exécuter.

Propriétés

Numéro d'article: 179706 - Dernière mise à jour: dimanche 18 septembre 2011 - Version: 3.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Excel 2000 Standard
  • Microsoft Visual C++ 5.0 Édition Entreprise
  • Microsoft Visual C++ 5.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 : 
kbnewfile kbfunctions kbprogramming kbautomation kbhowto kbinterop KB179706
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