Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

Verwenden von MFC zum Automatisieren von Excel und zum Erstellen und Formatieren einer neuen Arbeitsmappe

Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
179706 How to use MFC to automate Excel and create and format a new workbook
Zusammenfassung
In diesem Artikel wird gezeigt, wie Sie Microsoft Excel mithilfe der Microsoft Foundation Class-Bibliothek (MFC) Version 4.2 automatisieren. (Die MFC-Bibliothek wird mit Microsoft Visual C++ 5.0 und 6.0 installiert.)

Es wird beschrieben, wie Sie mithilfe der OLE-Automatisierung eine Microsoft Excel-Arbeitsmappe erstellen bzw. formatieren. Außerdem werden verschiedene Methoden und Eigenschaften (aus der Microsoft Excel-Typbibliothek) zum Hinzufügen von Daten zum Arbeitsblatt sowie zum Formatieren des Arbeitsblatts vorgestellt.

Hinweise zur Automatisierung von Microsoft Excel 2000 und 2002

Der Beispielcode in diesem Artikel verwendet aus der Excel 97-Objektbibliothek (Excel 8.olb) generierte Klassenwrapper. Leicht abgeändert kann dieser Code auf einen Automatisierungsclient angewendet werden, der Klassenwrapper für Excel 2000 (Excel9.olb) oder Excel 2002 (Excel.olb) verwendet. Weitere Informationen zur Verwendung des in diesem Artikel beschriebenen Beispielcodes mit der Microsoft Excel 2000- oder Microsoft Excel 2002-Typbibliothek finden Sie im folgenden Artikel der Microsoft Knowledge Base:
224925 INFO: Typenbibliotheken für Büro können sich mit neuer Version ändern
Weitere Informationen
Sie können den Code in diesem Artikel in die Meldungsbehandlungsfunktion eines Ereignisses kopieren, das in einer CPP-Datei der MFC-Bibliothek definiert ist. Der Beispielcode soll die Verwendung der IDispatch-Schnittstellen und Memberfunktionen veranschaulichen, die in der Typbibliothek "Excel8.olb" definiert sind. Der hauptsächliche Nutzen dieses Artikels besteht darin, dass Sie den Code im Beispiel genauer kennen lernen und verstehen können, damit Sie den Beispielcode abändern oder eigenen Code erstellen können, um Microsoft Excel 97 mit MFC zu automatisieren.

Anleitung zum Erstellen des Projekts

  1. Führen Sie die Schritte 1 bis 12 der Anleitung im folgenden Microsoft Knowledge Base-Artikel aus, um ein Beispielprojekt zu erstellen, das die in der Typbibliothek "Excel8.olb" definierten IDispatch-Schnittstellen und Memberfunktionen verwendet:
    178749Erstellen eines Automatisierungsprojekts mit MFC und einer Typenbibliothek
  2. Fügen Sie am Anfang der Datei "AutoProjectDlg.cpp" die folgende Zeile ein:
          #include "excel8.h"					
  3. Fügen Sie den folgenden Code zur Funktion "CAutoProjectDlg::OnRun()" in der Datei "AutoProjectDLG.cpp" hinzu:

    Beispielcode

          // 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. Fügen Sie die folgende Funktion an einer beliebigen Stelle vor der Funktion "CAutoProjectDlg::OnRun()" zur Datei "AutoProjectDLG.cpp" hinzu:

    Beispielcode

          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. Führen Sie die Anwendung in Developer Studio aus. Klicken Sie auf die Schaltfläche Ausführen, wenn das Dialogfeld angezeigt wird (der Beispielcode erstellt eine dialogfeldbasierte Anwendung).
Excel 8 8.0 XL97 XL8
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Eigenschaften

Artikelnummer: 179706 – Letzte Überarbeitung: 09/18/2011 11:31:00 – Revision: 3.0

  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Foundation Class Library 4.2
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • kbnewfile kbfunctions kbprogramming kbautomation kbhowto kbinterop KB179706
Feedback