Zum Einbetten und Automatisieren eines Microsoft Excel-Arbeitsblatt mit MFC

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 184663 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Zusammenfassung

Dieser Artikel beschreibt die betten Sie eine Microsoft Excel-Arbeitsblatt in ein View-Objekt in einer SDI-MFC-Anwendung.

Dieser Artikel enthält schrittweise Anweisungen für das Arbeitsblatt einzubetten und Hinzufügen von Text zu Zelle A1, sowie Kommentare, die jeder Schritt erklärt.

Obwohl der Beispielcode in diesem Artikel kann entnommen und in Ihrer Anwendung ablegen, der echte Vorteil lesen und Verstehen des -Beispiels stammt Code .

Weitere Informationen

Microsoft bietet Programmierbeispiele für Abbildung nur ohne Gewährleistung oder konkludent. Dies umfasst, ist jedoch nicht beschränkt auf konkludenten Garantien der Handelsüblichkeit oder Eignung für einen bestimmten Zweck. Dieser Artikel setzt voraus, dass Sie mit der Programmiersprache, die Programmierungsbeispiele ist und mit den Tools, die zum Erstellen und Debuggen von Prozeduren verwendet werden vertraut sind. Microsoft Support-Technikern helfen, Erläutern Sie die Funktionalität von einer bestimmten Prozedur. Jedoch können Sie nicht ändern diese Beispiele bieten Funktionen hinzugefügt oder Verfahren, um Ihren Anforderungen entsprechend zu erstellen.

Gehen Sie folgendermaßen vor um die MFC-Anwendung zu erstellen:
  1. Der Anwendungs-Assistenten verwenden, um eine neue MFC-Anwendungs-Assistent (EXE) zu erstellen-Projekt namens "Embed_Excel".
  2. Wählen Sie einfaches Dokument als Typ der Anwendung erstellen, und wählen Sie Container als den Typ der Unterstützung für Verbunddokumente aufnehmen. Akzeptieren Sie alle anderen Standardeinstellungen.

    Die folgenden Klassen werden generiert:

    Anwendung : CEmbed_ExcelApp in Embed_Excel.h und Embed_Excel.cpp

    Frame : CMainFrame in MainFrm.h und MainFrm.cpp

    Dokument : CEmbed_ExcelDoc in Embed_ExcelDoc.h und Embed_ExcelDoc.cpp

    Ansicht : CEmbed_ExcelView in Embed_ExcelView.h und Embed_ExcelView.cpp

    Container-Element : CEmbed_ExcelCntrItem in CntrItem.h und CntrItem.cpp
  3. Klicken Sie im Anzeigen auf Klassen-Assistenten . Klicken Sie auf die Registerkarte Automatisierung , klicken Sie auf Klasse hinzufügen , und wählen Sie Aus einer Typbibliothek . Suchen Sie die Microsoft Excel Typ Bibliothek , und fügen Sie alle Klassen in der Bibliothek Typ zum Projekt hinzu. Für Excel 97 befindet sich die Typ-Bibliothek in Excel8.olb. Für Excel 2000 Typ Bibliothek befindet sich in Excel9.olb, und für Excel 2002 und höher, die Bibliothek Typ es in Excel.exe.
  4. Fügen Sie folgende Zeile zu CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Fügen Sie die GetIDispatch-Methode zur 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. Fügen Sie folgende Zeile zu Embed_ExcelView.h:
          void EmbedAutomateExcel();
    					
  7. Fügen Sie die EmbedAutomateExcel-Methode zur 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. Fügen Sie folgende Zeile zu Embed_ExcelView.h:
          #include "excel8.h"
    						
    N Ote Wenn Sie Excel 2000 automatisieren, ist die Headerdatei "excel9.h". Wenn Sie Excel 2002 oder eine höhere Version von Excel automatisieren, ist die Headerdatei "excel.h".
  9. Anhand der OnInsertObject()-Methode des View-Klasse. Es ist interessant, Beachten Sie, dass diese Methode und die Methode, die wir gerade geschrieben haben, die verblüffende ähnlich sind. Tatsächlich ist der wir geschriebenen Code lediglich eine besondere Fall OnInsertObject(), die die Benutzer aus einer Liste der verfügbaren OLE auswählen ermöglicht, Objekte in der Anwendung einfügen. Da wir des Excel-Arbeitsblatts automatisieren möchten, können wir dieses Verhalten überschreiben. Entfernen Sie für unsere Anwendung alle Code aus den Innenbereich des InsertObject() und Ersetzen Sie ihn mit einem Aufruf von EmbedAutomateExcel().
  10. Kompilieren Sie und führen Sie die Anwendung.
  11. Klicken Sie im Menü Bearbeiten auf Neues Objekt einfügen .
Ergebnisse: Eine Microsoft Excel-Arbeitsblatt wird in der Ansicht eingebettet. Darüber hinaus wird Zelle A1 mit "Hello, World!" über die Automatisierung aufgefüllt.

Eigenschaften

Artikel-ID: 184663 - Geändert am: Mittwoch, 28. März 2007 - Version: 5.1
Die Informationen in diesem Artikel beziehen sich auf:
  • 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
Keywords: 
kbmt kbprogramming kbautomation kbhowto kbinterop KB184663 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 184663
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

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