您目前已離線,請等候您的網際網路重新連線

如何自動化 Excel 從 MFC 和 Visual C++ 2005年或 Visual C++.NET 填滿或取得使用陣列的範圍中的資料

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:308407
本文章的有 Microsoft C#.NET] 版本請參閱 302096
本文章的有 Microsoft Visual Basic.NET] 版本請參閱 302094
附註Microsoft Visual C++ 2005年]、 [Microsoft Visual C++.NET 2003,] 及 [Microsoft Visual C++.NET 2002年支援 Managed 程式碼模型所提供的 Microsoft.NET Framework 和不受管理的原生 Microsoft Windows 程式碼模型。本文資訊僅適用於不受管理的 Visual C++ 程式碼。
結論
本文將逐步告訴您,如何自動化 Microsoft Excel 從 Visual C++ 2005年或 Visual C++.NET 用來填滿及使用陣列來擷取多重儲存格範圍中的值。

建立 Excel 的自動化用的戶端

若要不需要填入儲存格一一次填寫多重儲存格範圍,您可以設定 Range 物件的 Value 屬性到二維陣列。同樣地,可藉由使用 Value 屬性一次擷取一個二維陣列的多個儲存格的值。下列步驟將告訴您這個處理程序,同時設定和擷取資料使用二維陣列。
  1. 請遵循下列微軟知識庫文件,以建立基本的自動化用戶端 」 建立自動化用戶端 > 一節中步驟:
    307473如何使用 Office 自動化在從 Visual C++.NET 型別程式庫
    在步驟 3,新增到表單的第二個按鈕和核取方塊。按鈕的 ID 變更 IDC_GETVALUES 及標題,以 取得的值。核取方塊的 ID 變更 IDC_CHECK 及標題,以 填滿與字串

    如果自動化 Office XP 從 Excel 2002,請在 [發行項的步驟 4,選取"Microsoft Excel 10.0 物件程式庫 」。Excel 2002 的預設位置是 C:\Program Files\Microsoft Office\Office10\Excel.exe。 或如果您自動化 Microsoft Office Excel 2003 中選取 [Microsoft Excel 11.0 物件庫]。在 Excel 2003 預設位置是 C:\Program Files\Microsoft Office\Office11\Excel.exe。選取下列的 Microsoft Excel 介面:
    • _Application
    • _Workbook
    • _Worksheet
    • 範圍
    • 活頁簿
    • 工作表
    在第 6 步驟加入 [直接在 一次的 # pragma 指示詞中 Autoprojectdlg.h 之後的 [下列 # include 陳述式:
    #include "CApplication.h"#include "CRange.h"#include "CWorkbook.h"#include "CWorkbooks.h"#include "CWorksheet.h"#include "CWorksheets.h"					
  2. 將下列兩個公用成員變數加入至 CAutoProjectDlg 類別:
    CApplication oExcel;CWorkbook oBook;					
  3. 在您對話方塊 IDC_CHECK] 上按一下滑鼠右鍵,並選取 [加入變數]。命名變數 m_bFillWithStrings,然後按一下 [完成]。
  4. 您對話方塊上連按兩下 [執行],並取代下列程式碼
    void CAutoProjectDlg::OnBnClickedRun(){	// TODO: Add your control notification handler code here}					
    與:
    void CAutoProjectDlg::OnBnClickedRun(){	CWorkbooks oBooks;	CWorksheets oSheets;	CWorksheet oSheet;	CRange oRange;	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);	// If you have not created Excel, create a new instance.	if (oExcel.m_lpDispatch == NULL) {		oExcel.CreateDispatch("Excel.Application");	}	// Show Excel to the user.	oExcel.put_Visible(TRUE);	oExcel.put_UserControl(TRUE);	// Add a new workbook and get the first worksheet in that book.	oBooks = oExcel.get_Workbooks();	oBook = oBooks.Add(covOptional);	oSheets = oBook.get_Worksheets();	oSheet = oSheets.get_Item(COleVariant((short)1));	// Get a range of data.	oRange = oSheet.get_Range(COleVariant("A1"),covOptional);	oRange = oRange.get_Resize(COleVariant((short)5),COleVariant((short)5));	COleSafeArray saRet;	DWORD numElements[2];	numElements[0] = 5;	numElements[1] = 5;	long index[2];	// Create a BSTR or double safe array.	if (m_bFillWithStrings.GetCheck())		saRet.Create(VT_BSTR,2,numElements);	else		saRet.Create(VT_R8,2,numElements);	// Fill the array with data.	for (int iRow = 1; iRow <= 5; iRow++) {		for (int iCol = 1; iCol <= 5; iCol++) {			index[0]=iRow-1;			index[1]=iCol-1;			if (m_bFillWithStrings.GetCheck()) {				CString szTemp;				szTemp.Format("%d|%d",iRow,iCol);				BSTR bstr = szTemp.AllocSysString();				saRet.PutElement(index,bstr);				SysFreeString(bstr);			} else {				double d = iRow * iCol;				saRet.PutElement(index,&d);			}		}	}	// Send the array to Excel.	oRange.put_Value(covOptional,COleVariant(saRet));}					
    Visual C++ 2005年中的 附註,您必須加入通用語言執行階段支援編譯器選項 (/ clr:oldSyntax) 來順利編譯先前的程式碼範例。 若要加入通用語言執行階段支援編譯器選項請依照下列步驟執行:
    1. 按一下 [專案],然後再按一下 [ProjectName 內容

      附註ProjectName 是預留位置專案的名稱。
    2. 展開 [組態屬性,] 然後按一下 [一般
    3. 在右窗格中按一下以選取 通用語言執行階段支援、 舊語法 (/ clr:oldSyntax)支援的通用語言執行階段 中的專案設定。
    4. 按一下 [套用],然後按一下 [確定]
    如通用語言執行階段的相關資訊支援編譯器選項,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站]: 這些步驟套用到整個發行項。
  5. 回到您的對話方塊,然後連按兩下 [取得的值。取代下列程式碼
    void CAutoProjectDlg::OnBnClickedGetvalues(){	// TODO: Add your control notification handler code here}					
    與:
    void CAutoProjectDlg::OnBnClickedGetvalues(){	CWorksheets oSheets;	CWorksheet oSheet;	CRange oRange;	COleVariant covOptional(DISP_E_PARAMNOTFOUND,VT_ERROR);	// Make sure that Excel has been started.	if (oExcel.m_lpDispatch == NULL) {		AfxMessageBox("Excel has not been started.  Press button1 to start Excel.");		return;	}	// Get the first worksheet.	oSheets = oBook.get_Worksheets();	oSheet = oSheets.get_Item(COleVariant((short)1));	// Set the range of data to retrieve   	oRange = oSheet.get_Range(COleVariant("A1"),COleVariant("E5"));	// Get the data.	COleSafeArray saRet(oRange.get_Value(covOptional));        long iRows;        long iCols;        saRet.GetUBound(1, &iRows);        saRet.GetUBound(2, &iCols);	CString valueString = "Array Data:\r\n";	long index[2];	// Loop through the data and report the contents.	for (int rowCounter = 1; rowCounter <= iRows; rowCounter++) {		for (int colCounter = 1; colCounter <= iCols; colCounter++) {			index[0]=rowCounter;			index[1]=colCounter;		   			COleVariant vData;			saRet.GetElement(index,vData);			CString szdata(vData);            valueString += szdata;			valueString += "\t";				}		valueString += "\r\n";	}	AfxMessageBox(valueString,MB_SETFOREGROUND,NULL);}					

測試自動化用戶端

  1. 按下 F5 以建置並執行範例程式。
  2. 按一下 [執行]。程式開頭新的活頁簿的 Excel 並填入儲存格 A1:E5 的第一張工作表上的數字資料的陣列。
  3. 按一下 [取得值。程式到新的陣列擷取中的儲存格 A1:E5 資料,並在訊息方塊中顯示結果。
  4. 選取 填滿方式字串,然後按一下 [執行],以字串資料填入儲存格 A1:E5。
  5. 按一下 [取得的值 若要在訊息方塊顯示字串值]。

疑難排解

如果加入的 Excel 物件程式庫類別包裝函式藉由使用 [加入類別來源 TypeLib 精靈中的 [檔案] 選項時,您可能會收到錯誤訊息,當您瀏覽至物件程式庫。若要避免這個問題,輸入完整的路徑和檔案名稱,物件程式庫,而非的瀏覽至檔案。 如需詳細資訊按一下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
311408注意: '唯讀' 警告時從程式庫加入 MFC 類別
如果當您建置範例應用程式,您會收到下列的錯誤訊息,變更 CRange.h 中 Variant 的 DialogBox"為"Variant _DialogBox 」:
警告 C4003: 沒有足夠實質參數為巨集 'DialogBoxA'
如需造成此錯誤的詳細資訊,請參閱下列知識庫文件:
311407注意: MFC 精靈不會解決與 API 的巨集的命名衝突
参考
如需詳細資訊,請參閱下列 Microsoft 開發人員網路 MSDN 網站:
與 Visual Studio 的 Microsoft Office 程式開發
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
使用陣列來設定和擷取的相關資訊 Excel 在較早版本的 Visual Studio 的資料,請參閱下列知識的基底文件:
186120如何使用 MFC 來自動化 Excel 並填入陣列的範圍
186122如何使用 MFC 來自動化 Excel,並取得從範圍的陣列
247412從 Visual Basic 傳送資料至 Excel 的方法資訊:
超大型核範圍 mfc

警告:本文為自動翻譯

內容

文章識別碼:308407 - 最後檢閱時間:01/17/2007 08:45:49 - 修訂: 6.3

Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft Office Excel 2003, Microsoft Excel 2002 Standard Edition

  • kbmt kbautomation kbhowtomaster KB308407 KbMtzh
意見反應