Jak vložit a automatizovat listu aplikace Microsoft Excel s MFC

Překlady článku Překlady článku
ID článku: 184663 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Souhrn

Tento článek popisuje, jak vložit aplikace Microsoft Excel sešit do objektu zobrazení v aplikaci SDI MFC.

Tento článek obsahuje podrobné pokyny pro vložení listu a přidání nějaký text do buňky A1, stejně jako komentáře vysvětlením každého kroku.

Přestože ukázkový kód uvedený v tomto článku může přijmout a do aplikace, ve prospěch skutečného pochází z čtení a porozumění vzorku kód .

Další informace

Společnost Microsoft poskytuje ukázky programování pouze pro ilustraci bez žádné záruky výslovně uvedené nebo mlčky. To zahrnuje, ale není omezen pouze na předpokládaných záruk vztahujících se k obchodovatelnosti nebo vhodnosti pro určitý účel. Tento článek předpokládá, že jste je obeznámen s programovacím jazykem, který je předmětem ukázky a s nástroji, které slouží k vytvoření a ladění skriptu. Pracovníci technické podpory společnosti Microsoft mohou vysvětlit funkce určitého postupu. Však nemohou tyto příklady přidány funkce nebo vytvářet postupy podle svých specifických požadavků.

Chcete-li vytvořit aplikaci MFC, postupujte takto:
  1. Slouží k vytvoření nové MFC AppWizard (EXE) AppWizard projektu s názvem "Embed_Excel".
  2. Vyberte jednotného dokladu jako typ aplikacím vytvářet a vyberte kontejner jako typ podpory složeného dokumentu chcete zahrnout. Přijmout všechny ostatní výchozí nastavení.

    Jsou generovány následující třídy:

    Aplikace: CEmbed_ExcelApp Embed_Excel.h a Embed_Excel.cpp

    Rámeček: CMainFrame MainFrm.h a MainFrm.cpp

    Dokument: CEmbed_ExcelDoc Embed_ExcelDoc.h a Embed_ExcelDoc.cpp

    Zobrazení: CEmbed_ExcelView Embed_ExcelView.h a Embed_ExcelView.cpp

    Kontejner zboží: CEmbed_ExcelCntrItem CntrItem.h a CntrItem.cpp
  3. V nabídce Zobrazit klepněte na příkaz ClassWizard. Klepněte na kartu automatizace, klepněte na tlačítko Přidat třídu a zvolte Z knihovny typů. Vyhledejte knihovnu typů pro Microsoft Excel a přidat všechny třídy do projektu v knihovně typů. Pro aplikaci Excel 97 knihovnu typů nachází v Excel8.olb. Pro aplikaci Excel 2000 knihovnu typů nachází v Excel9.olb a Excel 2002 a novější , knihovnu typů umístěn v Excel.exe.
  4. Přidejte následující řádek CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Potom přidejte metodu 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. Přidejte následující řádek Embed_ExcelView.h:
          void EmbedAutomateExcel();
    					
  7. Potom přidejte metodu 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. Přidejte následující řádek Embed_ExcelView.h:
          #include "excel8.h"
    						
    N itát Pokud aplikace Excel 2000, jsou automatizace, je soubor záhlaví "excel9.h". Pokud jste jsou automatizace aplikace Excel 2002 nebo novější verzi aplikace Excel, je soubor záhlaví "excel.h".
  9. Podívejte se metoda OnInsertObject() třídy zobrazení. Je zajímavé poznamenat, že tato metoda a metoda jsme jste právě napsali, jsou velmi podobné. Ve skutečnosti je kód jsme napsání pouze speciální případ OnInsertObject(), která umožňuje uživateli vybrat ze seznamu dostupných OLE objekty vložit do aplikace. Protože chceme automatizovat list aplikace Excel, doporučujeme toto chování potlačit. Naše aplikace veškerý kód z vnitřku InsertObject() a nahraďte volání EmbedAutomateExcel().
  10. Kompilace a spuštění aplikace.
  11. V nabídce Úpravy klepněte na příkaz Vložit nový objekt.
Výsledky: List aplikace Microsoft Excel vložen do zobrazení. Kromě toho buňka A1 je vyplněno "Ahoj, World! „ prostřednictvím automatizace.

Vlastnosti

ID článku: 184663 - Poslední aktualizace: 28. března 2007 - Revize: 5.1
Informace v tomto článku jsou určeny pro produkt:
  • 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
Klíčová slova: 
kbmt kbprogramming kbautomation kbhowto kbinterop KB184663 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:184663

Dejte nám zpětnou vazbu

 

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