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

좋은 웹페이지 즐겨찾기