FC를 사용하여 Microsoft Excel 워크시트를 내장하고 자동화하는 방법
9793 단어 Microsoft
개요
loadTOCNode(1, 'summary');
이 문서에서는 SDI MFC 응용 프로그램의 View 객체에 Microsoft Excel 워크시트를 삽입하는 방법을 설명합니다.
본고는 작업표를 삽입하고 단원격 A1에 텍스트를 추가하는 단계별 설명을 포함하며 각 단계를 설명하는 주석을 포함한다.
비록 본고의 예시 코드를 응용 프로그램에 직접 가져올 수 있지만, 본고의 예시를 읽고 이해해야만 당신이 진정으로 이익을 얻을 수 있습니다.
추가 정보
loadTOCNode(1, 'moreinformation');
다음은 MFC 응용 프로그램을 작성하는 단계입니다.
일.
응용 프로그램 마법사를 사용하여 Embed_Excel이라는 MFC 응용 프로그램 마법사(EXE) 항목을 새로 만듭니다.
이.
작성할 응용 프로그램 유형으로 단일 문서를 선택하고 포함할 복합 문서 지원 유형으로 컨테이너를 선택합니다.다른 모든 기본 설정을 수락합니다.다음 클래스가 생성됩니다. Application:Embed_Excel.h 및 Embed_Excel.cpp의 CEmbed_ExcelApp Frame:MainFrm.h와 MainFrm.cpp의 CMainFrame Document:Embed_ExcelDoc.h 및 Embed_ExcelDoc.cpp의 CEmbed_ExcelDoc View:Embed_ExcelView.h 및 Embed_ExcelView.cpp의 CEmbed_ExcelView Container Item:CntrItem.h 및 CntrItem.cpp의 CEmbed_ExcelCntrItem
삼.
보기 메뉴에서 클래스 마법사를 누르십시오.자동화 탭을 클릭하고 클래스 추가 를 클릭하고 유형 라이브러리에서 를 선택하십시오.icrosoft Excel 유형 라이브러리를 찾은 다음 유형 라이브러리의 모든 클래스를 프로젝트에 추가합니다.Excel 97의 경우 유형 라이브러리가 Excel 8에 있습니다.olb.Excel 2000의 경우 유형 라이브러리가 Excel9에 있습니다.olb;Excel 2002의 경우 유형 라이브러리는 Excel에 있습니다.exe.
사.
다음 코드를 CntrItem에 추가합니다.h:
LPDISPATCH GetIDispatch();
오.
그런 다음 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!
");
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!
");
return NULL;
}
//After assuring ourselves it is valid, return the IDispatch
//interface to the caller.
ASSERT(lpDispatch != NULL);
return lpDispatch;
}
육.
Embed_에 다음 줄 코드 추가하기ExcelView.h:
void EmbedAutomateExcel();
칠.
그런 다음 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( ColeVariant( (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();
}
팔.
Embed_에 다음 줄 코드 추가하기ExcelView.h:
#include "excel8.h"
참고: Excel 2000을 자동화하려면 헤더 파일은 "excel9.h"여야 합니다.Excel 2002를 자동화하려면 헤더 파일이 "excel.h"여야 합니다.구.
View 클래스의 OnInsertObject() 메서드를 참조하십시오.당신은 매우 재미있는 일을 발견할 수 있을 것이다. 이 방법은 우리가 방금 쓴 방법과 놀랍게도 비슷하다.사실상, 우리가 작성한 코드는 On InsertObject () 의 한 예일 뿐, 사용자가 사용할 수 있는 OLE 대상 목록에서 응용 프로그램에 삽입할 대상을 선택할 수 있도록 한다.우리의 목적은 Excel 워크시트를 자동화하는 것뿐이기 때문에 이 행위를 덮어씁니다.InsertObject() 내부에서 모든 코드를 제거하고 EmbedAutomateExcel() 호출을 대신합니다.
십.
응용 프로그램을 컴파일하고 실행합니다.
십일.
편집 메뉴에서 를 클릭하여 새 객체를 삽입합니다.결과: Microsoft Excel 워크시트가 View 객체에 포함됩니다.또한 자동화를 통해 셀 A1의 내용에'Hello, World!'를 입력했습니다.
이 글의 내용은 다음과 같습니다.
•
icrosoft Excel 2000 Standard Edition
•
icrosoft Visual C++ 5.0 Professional
•
icrosoft Visual C++ 6.0 Professional
•
Microsoft Foundation Class Library 4.2
•
Microsoft Office XP Developer Edition
•
Microsoft Office 2000 Developer Edition
•
icrosoft Excel 2002 Standard Edition
•
icrosoft Excel 97 Standard Edition
더 많은 기술 기사는 시창권의 개인 사이트를 참조하십시오http://www.joyvc.cn
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Microsoft에 인증되지 않은 취약점? 이야기Microsoft는 제품이나 서비스의 취약성을 발견하면 보상금을 받을 수 있는 제도 「Microsoft Bug Bounty Program」이 있다. 본 기사에서는 Microsoft에 인정되지 않았지만, 유저에게의 리...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.