Hoe insluiten en automatiseren van Microsoft Excel-werkblad met MFC

Vertaalde artikelen Vertaalde artikelen
Artikel ID: 184663 - Bekijk de producten waarop dit artikel van toepassing is.
Alles uitklappen | Alles samenvouwen

Samenvatting

In dit artikel wordt beschreven hoe u een Microsoft Excel-bestand insluiten Werk blad in een weergaveobject in een SDI MFC-toepassing.

In dit artikel bevat stapsgewijze instructies voor het insluiten van het werk blad en het toevoegen van enkele tekst aan cel A1, evenals commentaar waarin elke stap worden uitgelegd.

Hoewel de voorbeeldcode in dit artikel worden genomen en in uw toepassing, zetten de echte voordeel is afkomstig van lezen en begrijpen van het monstercode.

Meer informatie

Microsoft biedt program meer voorbeelden ter illustratie alleen, zonder expliciete of impliciete garantie. Dit omvat, maar is niet beperkt tot, de impliciete garanties van verkoopbaarheid of geschiktheid voor een bepaald doel. In dit artikel wordt ervan uitgegaan dat u bekend met de programmeer taal worden opgespoord en met de hulp programma's die worden gebruikt bent voor het maken en waarmee fouten in procedures. Ondersteuningstechnici van Microsoft kunnen de functionaliteit van een bepaalde procedure uitgelegd. Zij zal deze voorbeelden om extra functionaliteit of samens tellen van procedures om te voldoen aan uw specifieke vereisten echter niet wijzigen.

Het MFC-toepassing wilt maken, gaat u als volgt te werk:
  1. AppWizard gebruik maken van een nieuwe MFC AppWizard (. EXE) project met de naam "embed_excel."
  2. Selecteer het type van toepassing voor één Document Maak en Container selecteren als het type ondersteuning voor samengestelde documenten opnemen. Accepteer alle standaardinstellingen.

    De volgende klassen zijn weer gegeven:

    Toepassing: CEmbed_ExcelApp Embed_Excel.h en Embed_Excel.cpp

    Frame: CMainFrame MainFrm.h en MainFrm.cpp

    Document: CEmbed_ExcelDoc in Embed_ExcelDoc.h en Embed_ExcelDoc.cpp

    Weergave: CEmbed_ExcelView in Embed_ExcelView.h en Embed_ExcelView.cpp

    Container object: CEmbed_ExcelCntrItem CntrItem.h en CntrItem.cpp
  3. Op deWeergavemenu, klikt u opClassWizard. Klik op deAutomatiseringen klik opKlasse toevoegen, en kiesVan een typebibliotheek. Zoek deTypebibliotheek van Microsoft Excel, en de klassen in de typebibliotheek aan uw project toevoegen. Voor Excel 97 is de typebibliotheek bevindt zich in Excel8. olb. Voor Excel 2000 het type bibliotheek bevindt zich in excel9. olb en voor Excel 2002en hoger, de typebibliotheek van het vindt u in Excel. exe.
  4. Voeg de volgende regel toe aan CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Vervolgens de methode GetIDispatch aan CntrItem.cpp toevoegen:
       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. Voeg de volgende regel toe aan Embed_ExcelView.h:
          void EmbedAutomateExcel();
    					
  7. Voegt de methode 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. Voeg de volgende regel toe aan Embed_ExcelView.h:
          #include "excel8.h"
    						
    NOTEAls u Excel 2000 automatiseert, is het header-bestand 'excel9. h'. Als u Excel 2002 of een latere versie van Excel automatiseren wilt, is het header-bestand 'excel.h'.
  9. Bekijk de OnInsertObject() methode van de klasse weer geven. Deze Deze methode en de methode die we zojuist hebt geschreven, zijn interessant is opmerkelijk is vergelijkbaar. De code die is geschreven is in feite slechts een speciaal geval van OnInsertObject(), waarmee de gebruiker te selecteren uit een lijst met beschikbare OLE objecten in de toepassing wilt invoegen. Omdat we alleen wilt automatiseren de Excel-werkblad, we dit gedrag overschrijven. Voor onze toepassing, verwijdert u alle de vanaf de binnenkant van de InsertObject()-code te vervangen door een aanroep van EmbedAutomateExcel().
  10. Compileren en uitvoeren van de toepassing.
  11. Op deBewerkenmenu, klikt u opNieuw Object invoegen.
Resultaten: Een Microsoft Excel-werkblad is ingesloten in de weergave. Bovendien wordt cel A1 gevuld met "Hello, World!" via automatisering.

Eigenschappen

Artikel ID: 184663 - Laatste beoordeling: zaterdag 26 februari 2011 - Wijziging: 2.0
De informatie in dit artikel is van toepassing op:
  • Microsoft Office Excel 2007
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Foundation Class Library 4.2
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
Trefwoorden: 
kbprogramming kbautomation kbhowto kbinterop kbmt KB184663 KbMtnl
Automatisch vertaald artikel
BELANGRIJK: Dit artikel is vertaald door de vertaalmachine software van Microsoft in plaats van door een professionele vertaler. Microsoft biedt u professioneel vertaalde artikelen en artikelen vertaald door de vertaalmachine, zodat u toegang heeft tot al onze knowledge base artikelen in uw eigen taal. Artikelen vertaald door de vertaalmachine zijn niet altijd perfect vertaald. Deze artikelen kunnen fouten bevatten in de vocabulaire, zinsopbouw en grammatica en kunnen lijken op hoe een anderstalige de taal spreekt en schrijft. Microsoft is niet verantwoordelijk voor onnauwkeurigheden, fouten en schade ontstaan door een incorrecte vertaling van de content of het gebruik ervan door onze klanten. Microsoft past continue de kwaliteit van de vertaalmachine software aan door deze te updaten.
De Engelstalige versie van dit artikel is de volgende:184663

Geef ons feedback

 

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