Numer ID artykułu: 311546 - Ostatnia weryfikacja: 17 stycznia 2007 - Weryfikacja: 5.1

Jak osadzać i automatyzować arkusz programu Excel przy użyciu klas MFC i języka Visual C++ 2005 lub Visual C++ .NET

Ten artykuł został opublikowany wcześniej pod numerem PL311546
Wersja tego artykułu dla programu Microsoft Visual C++ 6.0: 184663  (http://support.microsoft.com/kb/184663/PL/ ) .
Uwaga: Programy Microsoft Visual C++ 2005, Microsoft Visual C++ .NET 2003 i Microsoft Visual C++ .NET 2002 obsługują zarówno zarządzany model kodu dostarczany przez architekturę Microsoft .NET Framework, jak i niezarządzany macierzysty model kodu systemu Microsoft Windows. Informacje zamieszczone w tym artykule dotyczą tylko niezarządzanego kodu Visual C++

Na tej stronie

Rozwiń wszystko | Zwiń wszystko

Streszczenie

W tym artykule opisano krok po kroku sposób osadzania arkusza programu Excel w obiekcie View w aplikacji, w której wykorzystano interfejs z pojedynczym dokumentem (SDI), i klasy MCF (Microsoft Foundation Classes), przy użyciu programu Visual C++ 2005 lub Visual C++ .NET.

Tworzenie aplikacji MFC osadzającej arkusz programu Excel

Następujące kroki opisują sposób osadzania arkusza i automatyzowania arkusza w celu dodania danych do komórki.
  1. Uruchom program Microsoft Visual Studio .NET. W menu File (Plik) wybierz polecenie New (Nowy), a następnie kliknij polecenie Project (Projekt). W obszarze Project Types (Typy projektów) kliknij pozycję Visual C++ Projects (Projekty Visual C++), a następnie kliknij pozycję Console Application (Aplikacja konsoli) w obszarze Templates (Szablony). Użyj nazwy projektu Embed_Excel.

    Uwaga: W programie Visual C++ 2005 należy kliknąć pozycję Visual C++ zamiast Visual C++ Projects (Projekty Visual C++).
  2. Po wyświetleniu kreatora aplikacji MFC (MFC Application Wizard) wykonaj następujące kroki:
    1. Kliknij przycisk Application Type (Typ aplikacji), a następnie wybierz opcję Single Document (Pojedynczy dokument).
    2. Kliknij przycisk Compound Document Support (Obsługa dokumentów złożonych), a następnie wybierz opcję Container (Kontener).
    3. Kliknij przycisk Finish (Zakończ), aby zaakceptować wszystkie pozostałe ustawienia domyślne.
  3. Dodaj interfejsy z biblioteki obiektów programu Excel. Aby to zrobić, wykonaj następujące kroki:
    1. W menu Project (Projekt) kliknij polecenie Add Class (Dodaj klasę).
    2. Wybierz pozycję MFC Class From TypeLib (Klasa MFC z biblioteki typów) na liście szablonów i kliknij przycisk Open (Otwórz). Pojawia się kreator dodawania klasy z biblioteki typów (Add Class From TypeLib Wizard).

      Uwaga: W programie Visual C++ 2005 należy kliknąć przycisk Add (Dodaj) zamiast przycisku Open (Otwórz).
    3. Na liście dostępnych bibliotek typów zlokalizuj pozycję Microsoft Excel wersja Object Library. W przypadku programu Excel 2000 numer wersji to 9.0, numer wersji programu Excel 2002 to 10.0, a dla programu Microsoft Office Excel 2003 numer wersji to 11.0.
    4. Dodaj następujące interfejsy:
      • _Application
      • _Workbook
      • _Worksheet
      • Range
      • Workbooks
      • Worksheets
    5. Kliknij przycisk Finish (Zakończ).
  4. Dodaj następujący wiersz do pliku Cntritem.h jako publiczną funkcję członkowską klasy CEmbed_ExcelCntrItem:
    LPDISPATCH GetIDispatch();
  5. Dodaj metodę GetIDispatch do pliku Cntritem.cpp w następujący sposób:
    /*******************************************************************
    *   Ta metoda zwraca IDispatch* dla aplikacji powiązanej z
    *   tym kontenerem.
    ********************************************************************/ 
    LPDISPATCH CEmbed_ExcelCntrItem::GetIDispatch()
    {
    	//Ten wskaźnik i wskaźnik m_lpObject muszą być prawidłowe, aby umożliwić poprawne
    	//działanie tej funkcji. m_lpObject jest wskaźnikiem IUnknown dla
    	// tego obiektu.
    	ASSERT_VALID(this);
    
    	ASSERT(m_lpObject != NULL);
    
    	LPUNKNOWN lpUnk = m_lpObject;
    
    	//Osadzona aplikacja musi być uruchomiona, aby umożliwić poprawne działanie pozostałego
    	//kodu tej funkcji.
    	Run();
    
    	//QI dla interfejsu IOleLink wskaźnika m_lpObject.
    	LPOLELINK lpOleLink = NULL;
    	if (m_lpObject->QueryInterface(IID_IOleLink,
    		(LPVOID FAR*)&lpOleLink) == NOERROR)
    	{
    		ASSERT(lpOleLink != NULL);
    		lpUnk = NULL;
    
    		//Pobranie interfejsu IUnknown do powiązanej aplikacji.
    		if (lpOleLink->GetBoundSource(&lpUnk) != NOERROR)
    		{
    			TRACE0("Ostrzeżenie: Łącze nie jest podłączone!\n");
    			lpOleLink->Release();
    			return NULL;
    		}
    		ASSERT(lpUnk != NULL);
    	}
    
    	//QI dla interfejsu IDispatch połączonej aplikacji.
    	LPDISPATCH lpDispatch = NULL;
    	if (lpUnk->QueryInterface(IID_IDispatch, (LPVOID FAR*)&lpDispatch)
    		!=NOERROR)
    	{
    		TRACE0("Ostrzeżenie: nie obsługuje IDispatch!\n");
    		return NULL;
    	}
    
    	//Po zweryfikowaniu, że jest prawidłowy, interfejs IDispatch
    	//jest zwracany do obiektu wywołującego.
    	ASSERT(lpDispatch != NULL);
    	return lpDispatch;
    }
    					
    Uwaga: W programie Visual C++ 2005 należy dodać opcję kompilatora dla obsługi aparatu plików wykonywalnych języka wspólnego (/clr:oldSyntax), aby pomyślnie skompilować powyższy kod przykładowy. Aby dodać opcję kompilatora dla obsługi aparatu plików wykonywalnych języka wspólnego, wykonaj następujące kroki:
    1. Kliknij menu Project (Projekt), a następnie kliknij polecenie NazwaProjektu Properties (Właściwości).

      Uwaga: NazwaProjektu jest symbolem zastępczym dla nazwy projektu.
    2. Rozwiń węzeł Configuration Properties (Właściwości konfiguracyjne), a następnie kliknij pozycję General (Ogólne).
    3. W prawym okienku kliknij, aby zaznaczyć opcję Common Language Runtime Support, Old Syntax (/clr:oldSyntax) (Obsługa aparatu plików wykonywalnych języka wspólnego) w ustawieniach projektu Common Language Runtime support (Obsługa aparatu plików wykonywalnych języka wspólnego).
    4. Kliknij przycisk Apply (Zastosuj), a następnie kliknij przycisk OK.
    Aby uzyskać więcej informacji dotyczących opcji kompilatora dla obsługi aparatu plików wykonywalnych języka wspólnego, odwiedź następującą witrynę MSDN (Microsoft Developer Network) w sieci Web:
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx (http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx)
    Te kroki dotyczą całego artykułu.
  6. Dodaj następujący wiersz do pliku Embed_excelview.h jako publiczną metodę klasy CEmbed_ExcelView:
    void EmbedAutomateExcel();
    					
  7. Dodaj następujące wiersze do pliku Embed_excelview.cpp:
    #include "CApplication.h"
    #include "CWorkbook.h"
    #include "CWorksheet.h"
    #include "CRange.h"
    #include "CWorksheets.h"
    #include "CWorkbooks.h"
    
    /********************************************************************
    *   Ta metoda hermetyzuje proces osadzania arkusza programu Excel
    *   w obiekcie View i automatyzowania tego arkusza w celu dodania
    *   tekstu do komórki A1.
    ********************************************************************/ 
    void CEmbed_ExcelView::EmbedAutomateExcel()
    {
    	//Zmiana kursora w celu poinformowania użytkownika o wyjątkowych
    	//okolicznościach.
    	BeginWaitCursor();
    
    	CEmbed_ExcelCntrItem* pItem = NULL;
    	TRY
    	{
    		//Uzyskanie dokumentu skojarzonego z tym widokiem i upewnienie się, że jest on
    		//prawidłowy.
    		CEmbed_ExcelDoc* pDoc = GetDocument();
    		ASSERT_VALID(pDoc);
    
    		//Utworzenie nowego elementu skojarzonego z tym dokumentem i upewnienie się, że jest on 
    		//prawidłowy.
    		pItem = new CEmbed_ExcelCntrItem(pDoc);
    		ASSERT_VALID(pItem);
    
    		// Uzyskanie identyfikatora klasy dla arkusza programu Excel.
    		// Kod używany do tworzenia.
    		CLSID clsid;
    		if(FAILED(::CLSIDFromProgID(L"Excel.sheet",&clsid)))
    			//Wystarczy dowolny wyjątek. Konieczne jest tylko zakończenie instrukcji
    			//TRY.
    			AfxThrowMemoryException();
    
    		// Tworzenie osadzonego elementu programu Excel.
    		if(!pItem->CreateNewItem(clsid))
    			//Wystarczy dowolny wyjątek. Konieczne jest tylko zakończenie instrukcji
    			//TRY.
    			AfxThrowMemoryException();
    
    		//Upewnienie się, że nowy element CContainerItem jest prawidłowy.
    		ASSERT_VALID(pItem);
    
    		// Uruchomienie serwera w celu edycji elementu.
    		pItem->DoVerb(OLEIVERB_SHOW, this);
    
    		// Dowolny projekt interfejsu użytkownika, ten kod jest związany
    		// z wyborem ostatniego wstawionego elementu.
    		m_pSelection = pItem;   // Wybór ostatniego wstawionego elementu
    		pDoc->UpdateAllViews(NULL);
    
    		//Kwerenda dotycząca wskaźnika typu dispatch dla osadzonego obiektu. W
    		//tym przypadku jest to arkusz programu Excel.
    		LPDISPATCH lpDisp;
    		lpDisp = pItem->GetIDispatch();
    
    		//Dodanie tekstu w komórce A1 osadzonego arkusza programu Excel.
    		CWorkbook wb;
    		CWorksheets wsSet;
    		CWorksheet ws;
    		CRange CRange;
    		CApplication app;
    
    		//Skonfigurowanie CWorkbook wb do korzystania z lpDisp, IDispatch*
    		//rzeczywistego skoroszytu.
    		wb.AttachDispatch(lpDisp);
    
    		//Uzyskanie aplikacji dla arkusza.
    		app = wb.get_Application();
    
    		//Uzyskanie pierwszego arkusza w skoroszycie.
    		wsSet = wb.get_Worksheets();
    		ws = wsSet.get_Item(COleVariant((short)1));
    
    		//Uzyskanie obiektu CRange odpowiadającego komórce A1.
    		CRange = ws.get_Range(COleVariant("A1"), COleVariant("A1"));
    
    		//Wypełnienie komórki A1 ciągiem "Hello, World!"
    		CRange.put_Value2(COleVariant("Hello, World!"));
    
    		// UWAGA: Jeżeli automatyzowany jest program Excel 2002, metoda CRange.SetValue ma 
    		//dodatkowy opcjonalny parametr określający typ danych.  Jest to 
    		//parametr opcjonalny, dlatego istniejący kod będzie wciąż funkcjonować poprawnie, jednak w nowym 
    		//kodzie należy wykorzystać tę nową konwencję.  Wywołanie programu Excel2002 powinno  
    		//uwzględniać następujące elementy:
    
    		//CRange.SetValue( ColeVariant( (long)DISP_E_PARAMNOTFOUND, VT_ERROR ), 
    		//                COleVariant("Hello, World!"));
    	}
    
    	//Kod wykonywany w przypadku wystąpienia problemów.
    	CATCH(CException, e)
    	{
    		if (pItem != NULL)
    		{
    			ASSERT_VALID(pItem);
    			pItem->Delete();
    
    		}
    		AfxMessageBox(IDP_FAILED_TO_CREATE);
    	}
    	END_CATCH
    
    		//Przywrócenie normalnego kursora w celu poinformowania użytkownika o braku wyjątkowych
    		//okoliczności.
    		EndWaitCursor();
    }
    					
  8. Zastąp kod CEmbed_ExcelView::OnInsertObject w pliku Embed_excelview.cpp następującym kodem:
    void CEmbed_ExcelView::OnInsertObject()
    {
    	EmbedAutomateExcel();
    }
    						
    UWAGA: EmbedAutomateExcel jest tylko specjalną odmianą OnInsertObject, która umożliwia użytkownikowi wybranie elementu z listy dostępnych obiektów OLE, który należy wstawić do aplikacji. To zachowanie zostanie zastąpione, ponieważ nie jest wymagane do celów związanych z tą demonstracją.

Testowanie aplikacji

  1. Naciśnij klawisz F5, aby skompilować i uruchomić aplikację.
  2. W menu Edit (Edycja) aplikacji kliknij polecenie Insert New Object (Wstaw nowy obiekt).
  3. Sprawdź wyniki. Nowy arkusz programu Excel jest osadzany w obiekcie View z tekstem „Hello, World!” w komórce A1.

Rozwiązywanie problemów

  • Jeżeli zostaną dodane klasy osłonowe dla biblioteki obiektów programu Excel przy użyciu opcji File w kreatorze dodawania klas z biblioteki typów (Add Class From TypeLib Wizard), może zostać wyświetlony komunikat o błędzie podczas przeglądania biblioteki obiektów. Aby uniknąć tego problemu, należy wpisać pełną ścieżkę i nazwę pliku dla biblioteki obiektów zamiast przeglądania folderów w celu wskazania odpowiedniego pliku.Aby uzyskać dodatkowe informacje, kliknij numer artykułu poniżej w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
    311408  (http://support.microsoft.com/kb/311408/PL/ ) BUG: 'Read-Only' Warning When Adding MFC Class From Library
  • Jeżeli zostanie wyświetlony następujący komunikat o błędzie podczas kompilowania aplikacji przykładowej, należy zmienić „Variant DialogBox” w pliku CRange.h na „Variant _DialogBox”:
    Warning C4003: niedostateczna rzeczywista ilość parametrów dla makra 'DialogBoxA'
    Aby uzyskać więcej informacji dotyczących przyczyny tego błędu, zobacz następujący artykuł z bazy wiedzy Knowledge Base:
    311407  (http://support.microsoft.com/kb/311407/PL/ ) BUG: MFC Wizard Doesn't Resolve Naming Conflicts with API Macros

Materiały referencyjne

Aby uzyskać więcej informacji, odwiedź następującą witrynę MSDN (Microsoft Developer Network) w sieci Web:
Projektowanie rozwiązań przeznaczonych dla pakietu Microsoft Office przy użyciu programu Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx (http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx)
Aby uzyskać dodatkowe informacje dotyczące automatyzacji programu Excel, zobacz następujące artykuły z bazy wiedzy Knowledge Base:
308407  (http://support.microsoft.com/kb/308407/PL/ ) How To Automate Excel From C++ .NET and MFC To Fill or Obtain Data In a Range Using Arrays
308292  (http://support.microsoft.com/kb/308292/PL/ ) How To Automate Excel to Create And Format a New Workbook Using C++ .NET and MFC

Informacje zawarte w tym artykule dotyczą:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
Słowa kluczowe: 
kbcontainer kbhowtomaster KB311546
 

Tłumaczenia artykułów