Sposób osadzania i zautomatyzować arkusz programu Microsoft Excel z MFC

Tłumaczenia artykułów Tłumaczenia artykułów
Numer ID artykułu: 184663 - Zobacz jakich produktów dotyczą zawarte w tym artykule porady.
Rozwiń wszystko | Zwiń wszystko

Streszczenie

W tym artykule opisano sposób osadzania programu Microsoft Excel Arkusz do obiektu widoku w aplikacji SDI MFC.

W tym artykule Zawiera instrukcje krok po kroku dotyczące osadzanie arkusza i dodanie niektórych tekst w komórce A1, jak również uwagi wyjaśniające każdy krok.

Chociaż Przykładowy kod w tym artykule można podjąć i wprowadzane do aplikacji, rzeczywiste korzyści pochodzi z czytanie i zrozumienie próbki Kod.

Więcej informacji

Firma Microsoft podaje przykłady programowania wyłącznie, bez jakichkolwiek gwarancji wyrażonych wprost lub domyślnie. Obejmuje, ale nie jest ograniczona do domniemanych gwarancji jakości lub przydatności do określonego celu. W tym artykule założono, że czytelnik jest obeznany z językiem programowania, przy czym obrazuje i narzędzia, które są używane do tworzenia i debugowania procedur. Wykwalifikowani pracownicy pomocy technicznej firmy Microsoft mogą pomóc w wyjaśnieniu jak działa określona procedura. Jednak nie będą modyfikować tych przykładów ani dodawać żadnej funkcji i konstruować nowych procedur w celu spełnienia szczególnych wymagań.

Aby utworzyć aplikację MFC, wykonaj następujące kroki:
  1. Umożliwia utworzenie nowego AppWizard MFC (EXE) AppWizard Projekt o nazwie "embed_excel".
  2. Wybierz jednolity dokument jako typ aplikacji Tworzenie i wybierz kontener jako typ obsługi dokument złożony Dołącz. Zaakceptuj wszystkie inne ustawienia domyślne.

    Są następujące klasy generowane:

    Aplikacja: CEmbed_ExcelApp Embed_Excel.h i Embed_Excel.cpp

    Ramki: CMainFrame MainFrm.h i MainFrm.cpp

    Dokument: CEmbed_ExcelDoc w Embed_ExcelDoc.h i Embed_ExcelDoc.cpp

    Widok: CEmbed_ExcelView w Embed_ExcelView.h i Embed_ExcelView.cpp

    Element kontenera: CEmbed_ExcelCntrItem CntrItem.h i CntrItem.cpp
  3. Na Widok menu, kliknij przycisk ClassWizard. Kliknij przycisk Automatyzacja Kliknij pozycję Add Class, a następnie wybierz polecenie Z biblioteki typów. Znajdź Biblioteka typów programu Microsoft Excel, i dodać wszystkie klasy w bibliotece typów do projektu. Dla Program Excel 97 biblioteki typów znajduje się w Excel8.olb. Dla programu Excel 2000 typu Biblioteka znajduje się w Excel9.olb i w programie Excel 2002 i nowsze, biblioteki typów go zlokalizowany w Excel.exe.
  4. Dodaj następujący wiersz do CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Następnie dodać do CntrItem.cpp metodę GetIDispatch:
       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. Dodaj następujący wiersz do Embed_ExcelView.h:
          void EmbedAutomateExcel();
    					
  7. Dodaj metodę 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. Dodaj następujący wiersz do Embed_ExcelView.h:
          #include "excel8.h"
    						
    NOTE Jeśli zautomatyzowano programu Excel 2000 pliku nagłówka jest "excel9.h". Jeśli zautomatyzowano program Excel 2002 lub nowszej wersji programu Excel pliku nagłówka jest "excel.h".
  9. Przyjrzyj się metody OnInsertObject() klasy widoku. Go Należy zauważyć, że ta metoda i metody, które możemy właśnie zostały napisane, interesującym jest właśnie podobne. W rzeczywistości kod, który możemy został napisany jest jedynie szczególnym przypadkiem OnInsertObject(), która umożliwia użytkownikowi wybranie z listy dostępnych OLE obiekty, aby wstawić do aplikacji. Ponieważ chcemy automatyzacji Arkusz programu Excel, możemy zmienić to zachowanie. Dla naszej aplikacji, Usuń wszystkie kodu z wnętrza InsertObject() i zastąpić wywołanie EmbedAutomateExcel().
  10. Należy skompilować i uruchomić aplikację.
  11. Na Edycja menu, kliknij przycisk Wstawianie nowego obiektu.
Wyniki: Arkusz programu Microsoft Excel jest osadzony w widoku. Ponadto wypełniana komórki A1 "Hello, World!" za pomocą automatyzacji.

Właściwości

Numer ID artykułu: 184663 - Ostatnia weryfikacja: 21 czerwca 2011 - Weryfikacja: 2.0
Informacje zawarte w tym artykule dotyczą:
  • 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
Słowa kluczowe: 
kbprogramming kbautomation kbhowto kbinterop kbmt KB184663 KbMtpl
Przetłumaczone maszynowo
WAŻNE: Ten artykuł nie został przetłumaczony przez człowieka, tylko przez oprogramowanie do tłumaczenia maszynowego firmy Microsoft. Firma Microsoft oferuje zarówno artykuły tłumaczone przez ludzi, jak i artykuły tłumaczone maszynowo, dzięki czemu każdy użytkownik może uzyskać dostęp do całej zawartości bazy wiedzy Knowledge Base we własnym języku. Prosimy jednak pamiętać, że artykuły przetłumaczone maszynowo nie zawsze są doskonałe. Mogą zawierać błędy słownictwa, składni i gramatyki, przypominające błędy robione przez osoby, dla których język użytkownika nie jest językiem ojczystym. Firma Microsoft nie odpowiada za wszelkie nieścisłości, błędy lub szkody spowodowane nieprawidłowym tłumaczeniem zawartości oraz za wykorzystanie tej zawartości przez klientów. Oprogramowanie do tłumaczenia maszynowego jest często aktualizowane przez firmę Microsoft.
Anglojęzyczna wersja tego artykułu to:184663

Przekaż opinię

 

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