Làm th? nào đ? nhúng và t? đ?ng hoá m?t Microsoft Excel b?ng tính v?i MFC

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 184663 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

TÓM T?T

Bài vi?t này mô t? cách đ? nhúng m?t Microsoft Excel B?ng vào m?t đ?i tư?ng xem trong ?ng d?ng SDI MFC.

Bài vi?t này bao g?m các bư?c theo bư?c hư?ng d?n đ? nhúng b?ng tính và thêm m?t s? văn b?n vào ô A1, c?ng như ? ki?n gi?i thích t?ng bư?c.

M?c dù m?u m? trong bài vi?t này có th? đư?c th?c hi?n và đưa vào ?ng d?ng c?a b?n, các l?i ích th?c s? đ?n t? đ?c và hi?u bi?t v? m?u M?.

THÔNG TIN THÊM

Microsoft cung c?p l?p tr?nh ví d? đ? minh ho? ch?, không có b?o hành ho?c th? hi?n hay ng? ?. Đi?u này bao g?m, nhưng không gi?i h?n, b?o đ?m ng? ? kh? năng bán hàng ho?c cho m?t m?c đích c? th?. Bài vi?t này gi? đ?nh r?ng b?n đ? quen thu?c v?i ngôn ng? l?p tr?nh mà đang đư?c ch?ng minh và v?i nh?ng công c? đư?c s? d?ng đ? t?o ra và g? l?i th? t?c. Microsoft h? tr? các k? sư có th? giúp gi?i thích các ch?c năng c?a m?t th? t?c c? th?. Tuy nhiên, h? s? s?a đ?i các ví d? đ? cung c?p thêm ch?c năng ho?c xây d?ng quy tr?nh đ? đáp ?ng các yêu c?u c? th? c?a b?n.

Đ? t?o ra các ?ng d?ng MFC, h?y làm theo các bư?c sau:
  1. S? d?ng AppWizard đ? t?o ra m?t m?i MFC AppWizard (EXE) d? án đư?c đ?t tên "embed_excel."
  2. Ch?n tài li?u duy nh?t như lo?i ?ng d?ng đ? t?o ra, và ch?n Container là lo?i tài li?u h?p ch?t h? tr? đ? bao g?m. Ch?p nh?n t?t c? các thi?t l?p m?c đ?nh khác.

    Các l?p h?c sau đây có đư?c t?o ra:

    ?ng d?ng: CEmbed_ExcelApp Embed_Excel.h và Embed_Excel.cpp

    Khung: CMainFrame MainFrm.h và MainFrm.cpp

    Tài li?u: CEmbed_ExcelDoc trong Embed_ExcelDoc.h và Embed_ExcelDoc.CPP

    Xem: CEmbed_ExcelView trong Embed_ExcelView.h và Embed_ExcelView.CPP

    Kho ch?a kho?n m?c: CEmbed_ExcelCntrItem CntrItem.h và CntrItem.cpp
  3. Trên các Xem tr?nh đơn, nh?p vào ClassWizard. B?m vào các T? đ?ng hóa tab, b?m vào Thêm Class, và ch?n T? m?t thư vi?n ki?u. Xác đ?nh v? trí các Thư vi?n lo?i Microsoft Excel, và thêm t?t c? các l?p h?c trong thư vi?n ki?u cho d? án c?a b?n. Cho Excel 97, thư vi?n ki?u này t?a l?c t?i Excel8.olb. Cho Excel 2000 lo?i thư vi?n n?m ? Excel9.olb, và cho Excel 2002 và sau đó, thư vi?n ki?u nó n?m ? Excel.exe.
  4. Thêm d?ng sau vào CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Sau đó thêm các phương pháp 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!\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. Thêm d?ng sau vào Embed_ExcelView.h:
          void EmbedAutomateExcel();
    					
  7. Sau đó thêm các phương pháp 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. Thêm d?ng sau vào Embed_ExcelView.h:
          #include "excel8.h"
    						
    NOTE N?u b?n đang t? đ?ng hoá Excel 2000, t?p tin tiêu đ? là "excel9.h." N?u b?n đang t? đ?ng hoá Excel 2002 ho?c m?t phiên b?n sau này c?a Excel, t?p tin tiêu đ? là "excel.h."
  9. Xem xét các phương pháp OnInsertObject() c?a l?p View. Nó là thú v? đ? lưu ? r?ng phương pháp này, và các phương pháp mà chúng tôi đ? ch? vi?t, n?i b?t tương t?. Trong th?c t?, chúng tôi đ? vi?t m? là ch? đơn thu?n là m?t trư?ng h?p đ?c bi?t c?a OnInsertObject(), cho phép ngư?i dùng đ? ch?n t? m?t danh sách có s?n OLE các đ?i tư?ng đ? chèn vào các ?ng d?ng. B?i v? chúng tôi ch? mu?n t? đ?ng hoá các B?ng tính Excel, chúng tôi ghi đè hành vi này. Đ?i v?i ?ng d?ng c?a chúng tôi, lo?i b? t?t c? các M? t? bên trong c?a InsertObject() và thay th? b?ng m?t cu?c g?i đ?n EmbedAutomateExcel().
  10. Biên d?ch và ch?y các ?ng d?ng.
  11. Trên các Ch?nh s?a tr?nh đơn, nh?p vào Chèn đ?i tư?ng m?i.
K?t qu?: M?t Microsoft Excel b?ng tính đư?c nhúng vào quan đi?m. Ngoài ra, cell A1 dân cư v?i "Hello, World!" thông qua t? đ?ng hóa.

Thu?c tính

ID c?a bài: 184663 - L?n xem xét sau cùng: 20 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • 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
T? khóa: 
kbprogramming kbautomation kbhowto kbinterop kbmt KB184663 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:184663

Cung cấp Phản hồi

 

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