Как внедрить и автоматизировать лист Microsoft Excel с MFC

Переводы статьи Переводы статьи
Код статьи: 184663 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Аннотация

В данной статье описывается, как внедрение Microsoft Excel Лист в объект представления в приложении SDI MFC.

В данной статье содержит пошаговые инструкции для внедрения электронной таблицы и добавление некоторых текст в ячейку A1, а также комментарии, объясняющие каждого шага.

Несмотря на то что пример кода в этой статье можно съемки и поместить в приложение, настоящее преимущество поступает из чтение и понимание образца код.

Дополнительная информация

Корпорация Майкрософт предлагает примеры программного кода только для иллюстрации Это включает, но не ограничивается, подразумеваемые гарантии товарности или пригодности для определенной цели. В данной статье предполагается, что вы знакомы с языком программирования предложенном и с помощью средств, которые используются для создания и отладки. Сотрудники службы поддержки Майкрософт могут пояснить конкретной процедуры. Однако они не изменяет примеров для обеспечения дополнительных возможностей или удовлетворения конкретных требований.

Создание приложения MFC, выполните следующие действия.
  1. Используйте AppWizard для создания новых AppWizard MFC (EXE). проект с именем «Embed_Excel».
  2. Выберите тип приложения для одного документа создать и выберите контейнер в качестве типа поддержки составных документов Включите. Примите остальные параметры по умолчанию.

    Используются следующие классы создан:

    Приложение: CEmbed_ExcelApp в Embed_Excel.h и Embed_Excel.cpp

    Рамка: CMainFrame в MainFrm.h и MainFrm.cpp

    Документ: CEmbed_ExcelDoc в Embed_ExcelDoc.h и Embed_ExcelDoc.cpp

    Представление: CEmbed_ExcelView в Embed_ExcelView.h и Embed_ExcelView.cpp

    Элемент контейнера: CEmbed_ExcelCntrItem в CntrItem.h и CntrItem.cpp
  3. На Представление меню, нажмите кнопку ClassWizard. Нажмите кнопку Автоматизация Щелкните Добавление класса, а затем выберите Из библиотеки типов. Найдите Библиотеки типов Microsoft Excel, и добавить все классы в библиотеке типов в проект. Для Excel 97, библиотека типов находится в Excel8.olb. Для Excel 2000 тип библиотека находится в Excel9.olb, а также для Excel 2002 и более поздних версий, библиотека типов его расположенный в Excel.exe.
  4. Добавьте следующую строку к CntrItem.h:
    LPDISPATCH GetIDispatch();
    					
  5. Затем добавьте в метод 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. Добавьте следующую строку к Embed_ExcelView.h:
          void EmbedAutomateExcel();
    					
  7. Добавьте в метод 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. Добавьте следующую строку к Embed_ExcelView.h:
          #include "excel8.h"
    						
    Note При автоматизации Excel 2000, файл заголовка является «excel9.h». При автоматизации Excel 2002 или более поздней версии Excel, файл заголовка является «excel.h».
  9. Рассмотрим метод OnInsertObject() класса представления. Он Следует заметить, что этот метод и метод, мы написали точно так же удивительно похожи. На самом деле является лишь в особых случаях код, написанный OnInsertObject(), которая позволяет пользователю выбирать из списка доступных OLE объекты для вставки в приложение. Поскольку нам нужно автоматизировать Лист Excel, мы переопределить это поведение. Для нашего приложения удалить все код из внутренней части InsertObject() и замените вызов EmbedAutomateExcel().
  10. Скомпилируйте и запустите приложение.
  11. На Редактирование меню, нажмите кнопку Вставка объекта.
Результаты: Лист Microsoft Excel будет встроена в представлении. Кроме того заполняется ячейка A1 «Hello, World!» через автоматизацию.

Свойства

Код статьи: 184663 - Последний отзыв: 4 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • 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
Ключевые слова: 
kbprogramming kbautomation kbhowto kbinterop kbmt KB184663 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:184663

Отправить отзыв

 

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