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++
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.
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++).
Kliknij przycisk Application Type (Typ aplikacji), a następnie wybierz opcję Single Document (Pojedynczy dokument).
Kliknij przycisk Compound Document Support (Obsługa dokumentów złożonych), a następnie wybierz opcję Container (Kontener).
Kliknij przycisk Finish (Zakończ), aby zaakceptować wszystkie pozostałe ustawienia domyślne.
Dodaj interfejsy z biblioteki obiektów programu Excel. Aby to zrobić, wykonaj następujące kroki:
W menu Project (Projekt) kliknij polecenie Add Class (Dodaj klasę).
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).
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.
Dodaj następujące interfejsy:
_Application
_Workbook
_Worksheet
Range
Workbooks
Worksheets
Kliknij przycisk Finish (Zakończ).
Dodaj następujący wiersz do pliku Cntritem.h jako publiczną funkcję członkowską klasy CEmbed_ExcelCntrItem:
LPDISPATCH GetIDispatch();
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:
Kliknij menu Project (Projekt), a następnie kliknij
polecenie NazwaProjektu Properties (Właściwości).
Uwaga: NazwaProjektu jest symbolem zastępczym dla
nazwy projektu.
Rozwiń węzeł Configuration Properties (Właściwości konfiguracyjne), a następnie kliknij
pozycję General (Ogólne).
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).
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:
Dodaj następujący wiersz do pliku Embed_excelview.h jako publiczną metodę klasy CEmbed_ExcelView:
void EmbedAutomateExcel();
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();
}
Zastąp kod CEmbed_ExcelView::OnInsertObject w pliku Embed_excelview.cpp następującym kodem:
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ą.
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
W jaki sposób możemy poprawić jakość tych informacji?
W celu ochrony prywatności do opinii nie należy dołączać informacji kontaktowych.
Dziękujemy! Państwa opinia pozwoli nam udoskonalić nasze materiały pomocnicze. Więcej informacji o metodach pomocy można znaleźć w witrynie Pomoc techniczna.