如何使用 MFC 來自動化 Excel 並填入陣列的範圍

文章翻譯 文章翻譯
文章編號: 186120 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

本文將告訴您,如何自動化 Microsoft Excel 並填入值的陣列中的多重儲存格範圍。

其他相關資訊

若要填入多重儲存格的範圍而不會填入儲存格一一,您必須建立二維 Variant 由 Range 物件的呼叫 SetValue 巨集函式將傳遞至 Excel 的 SAFEARRAY。下列步驟說明這個處理程序。

自動化 Microsoft Excel 2000 與 2002年的附註

本文中的範例程式碼使用從 Excel 97 物件程式庫 (Excel 8.olb) 產生的類別包裝函式。稍微修改與這個程式碼可套用至 Excel 2000 (Excel9.olb) 或 Excel 2002 (Excel.olb) 可使用類別包裝函式的自動化用戶端。如需有關使用 Microsoft Excel 2000 或 2002年型別程式庫本文所述的程式碼範例的額外資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中:
224925資訊: 因為新發行的版本,可能會變更 Office 的型別程式庫

建立專案的步驟

  1. 請遵循步驟 1 到 12 下列的文件中若要建立範例專案使用 [IDispatch 介面和成員函式定義 Excel8.olb 型別程式庫中 「 Microsoft 知識庫中:
    178749如何建立使用 MFC 和型別程式庫的自動化專案
  2. 在步驟 4 和 5 父發行項 178749 中建立對話方塊,新增下列的控制項與屬性所指定。也加入相對應的成員變數:
                                      Member                Member
          Control   Name              Variable Type         Variable Name
          -----------------------------------------------------------------
          Edit      IDC_STARTINGCELL  m_sStartingCell       CString
          Edit      IDC_NUMROWS       m_iNumRows            short
          Edit      IDC_NUMCOLS       m_iNumCols            short
          CheckBox  IDC_STRING        m_bFillWithStrings    BOOL
    					
  3. AutoProjectDlg.cpp 檔案頂端加入下列行:
          #include "excel8.h"
    					
  4. 將下列程式碼加入至 CAutoProjectDlg::OnRun() AutoProjectDlg.cpp 檔案中。

    範例程式碼

          // OLE Variant for Optional.
          COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
    
          _Application objApp;
    
          _Workbook objBook;
          Workbooks objBooks;
          Worksheets objSheets;
          _Worksheet objSheet;
          Range range;
    
          if(!UpdateData(TRUE))
          {
             return;
          }
    
          // Instantiate Excel and start a new workbook.
          objApp.CreateDispatch("Excel.Application");
          objBooks = objApp.GetWorkbooks();
          objBook = objBooks.Add(VOptional);
          objSheets = objBook.GetWorksheets();
          objSheet = objSheets.GetItem(COleVariant((short)1));
    
          //Get the range where the starting cell has the address
          //m_sStartingCell and it's dimensions are m_iNumRows x m_iNumCols.
          range = objSheet.GetRange(COleVariant(m_sStartingCell),
                                    COleVariant(m_sStartingCell));
          range = range.GetResize(COleVariant(m_iNumRows),
                                  COleVariant(m_iNumCols));
    
          //*** Fill the range with an array of values.
    
          //Create the SAFEARRAY.
          COleSafeArray saRet;
          DWORD numElements[2];
          numElements[0]= m_iNumRows;   //Number of rows in the range.
          numElements[1]= m_iNumCols;   //Number of columns in the range.
    
          if(m_bFillWithStrings)
          {
             saRet.Create(VT_BSTR, 2, numElements);
          }
          else
          {
             saRet.Create(VT_R8, 2, numElements);
          }
    
          //Fill the SAFEARRAY.
          long index[2];
          long iRow;
          long iCol;
    
          for(iRow=0;iRow<=m_iNumRows-1;iRow++)
          {
             for(iCol=0;iCol<=m_iNumCols-1;iCol++)
             {
                index[0] = iRow;
                index[1] = iCol;
                if(m_bFillWithStrings)      //Fill with Strings.
                {
                   VARIANT v;
                   CString s;
                   VariantInit(&v);
                   v.vt = VT_BSTR;
                   s.Format("r%dc%d", iRow, iCol);
                   v.bstrVal = s.AllocSysString();
                   saRet.PutElement(index, v.bstrVal);
                   SysFreeString(v.bstrVal);
                   VariantClear(&v);
                }
                else                     //Fill with Numbers.
                {
                   double d;
                   d = (iRow*1000) + iCol;
                   saRet.PutElement(index, &d);
                }
             }
          }
    
          //Set the range value to the SAFEARRAY.
          range.SetValue(COleVariant(saRet));
          saRet.Detach();
    
          //Return control of Excel to the user.
          objApp.SetVisible(TRUE);
          objApp.SetUserControl(TRUE);
    					
  5. 編譯並執行專案。
  6. 指定對話方塊上控制項的下列的值:
          Control               Contents
          ------------------------------
          IDC_STARTINGCELL      A1
          IDC_NUMROWS           10
          IDC_NUMCOLS           5
          IDC_STRING            True
    						
    按一下 [確定]。

    結果: 新的活頁簿產生的第一個工作表的儲存格 A1:E10 填入字串值。
  7. 指定對話方塊上控制項的下列的值:
          Control               Contents
          ------------------------------
          IDC_STARTINGCELL      C3
          IDC_NUMROWS           2
          IDC_NUMCOLS           9
          IDC_STRING            False
    						
    按一下 [確定]。

    結果: 新的活頁簿產生的第一個工作表的儲存格 C3:K4 填入數字值。

?考

如需有關如何自動化使用 MFC 的 Microsoft Excel 的詳細資訊,請參閱下列文件 「 Microsoft 知識庫 」 中:
186122如何使用 MFC 來自動化 Excel,並取得從範圍的陣列

184663如何內嵌和自動化與 MFC 的 Microsoft Excel 工作表

179706使用 MFC 來自動化 Excel,並建立/格式新的活頁簿

178781如何自動化 Excel 使用 MFC 和工作表函數

178783如何使用 MFC 建立 Microsoft Excel 圖表

屬性

文章編號: 186120 - 上次校閱: 2007年1月23日 - 版次: 4.2
這篇文章中的資訊適用於:
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 97 Standard Edition
關鍵字:?
kbmt kbautomation kbcode kbhowto kbinterop KB186120 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:186120
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

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