VC操作Excel之基本操作

來源:互聯網
上載者:User

      最近由於工作需要,不得不操作Excel,包括基本的資料輸入輸出、字型設定、顏色設定、儲存格的合并、填充色的設定,當然還包括圖表的產生以及漸近線的操作等。折騰了許久,項目終於完成了^_^。現在將學習操作Excel的點點滴滴記錄下來和大家一同分享,也作為自己的一次總結。

      1、Excel的物件模型(有人稱其為階層)

      開啟一個Excel工作表,點擊“工具”->“宏”->“Visual Basic 編輯器”選項開啟VB的編輯器,開啟協助文檔,裡面“Microsoft Excel Visual Basic 參考”下的“Microsoft Excel 物件模型”展示了完整的Excel的階層,是不是有點類似於MFC的繼承圖表啊?利用協助文檔我們可以找到一些需要的知識,下面介紹一些類:

      _Application:表示整個的Excel應用程式,包含一個活頁簿集合

      Workbooks:活頁簿集合,包含N個活頁簿(Workbook)

      _Workbook:活頁簿,包含一個工作表(sheets)集合

      Worksheets:工作表集合,包含N個工作表

      _Worksheet:工作表,也就是我們在Excel中看到的Sheet1、Sheet2、Sheet3,它是我們操作Excel的基本單位

      Range:這是儲存格的集合,我們知道Excel是由一個個的儲存格組成的,通過Range來操作儲存格

      Font:用於設定儲存格的字型、顏色、字型大小、粗體設定

      Interior:設定底色

      Boards:設定地區內所有儲存格的邊框,如果要設定一組地區的外邊框的話用Rang->BorderAround設定

      下面用一個具體的例子來說明怎麼通過MFC來操作Excel

      2、Excel庫的插入

      在我們MFC的工程中,按Ctrl+W開啟MFC類嚮導對話方塊,點擊“Add Class...”->“From a type Library...”,找到你所使用的excel類型庫,我使用的在目錄C:/Program Files/Microsoft Office/OFFICE11下的“EXCEL.EXE”檔案,尋找時檔案類型選“All Files”,然後添加我們所需要的類,通常以上列舉的前6類是必須的,其它的需要時再添加。我不認為全部添加是一種好的做法,一個我覺得很亂,另外產生的excel.cpp檔案會很大。我建議瀏覽一遍這些類,這樣當你做些操作時可以更清楚的知道需要添加哪些類。添加完需要的類後,我們就可以來做一些基本的操作了。

      3、Com支援庫的初始化

      通常在App的InitInstance()裡面加入初始化和關閉COM庫的操作,在DoModal()調用之前加入初始化的代碼:

      if (CoInitialize(NULL) != 0)<br />{<br />AfxMessageBox("初始化COM支援庫失敗!");<br />exit(1);<br />}

      在return之前加入CoUninitialize(); 關閉CON庫。

      4、代碼示範一些基本的操作

      首先別忘了包含標頭檔“excel.h”,若用到_variant_t()時,需要包含標頭檔“comdef.h”和“comutil.h”,否則會出現錯誤:

“error C2065: '_variant_t' : undeclared identifier”。

      下面的程式碼封裝括了一些基本的操作:

// 變數的定義<br />_Application app;<br />Workbooks books;<br />_Workbook book;<br />Worksheets sheets;<br />_Worksheet sheet;<br />Range range;<br />LPDISPATCH lpDisp;<br />COleVariant vResult;</p><p>CString str = "";</p><p>COleVariant<br />covTrue((short)TRUE),<br />covFalse((short)FALSE),<br />covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);</p><p>//建立Excel 2003伺服器(啟動Excel)<br />if (!app.CreateDispatch("Excel.Application",NULL))<br />{<br />AfxMessageBox("Create Excel service failure!");<br />return;<br />}</p><p>// 設定為FALSE時,後面的app.Quit();注釋要開啟<br />// 否則EXCEL.EXE進程會一直存在,並且每操作一次就會多開一個進程<br />app.SetVisible(TRUE);<br />books.AttachDispatch(app.GetWorkbooks(),true);</p><p>/*<br />*開啟一個活頁簿。<br />*Excel 2000 只需要13個參數就行,Excel 2003需要15個參數<br />*/<br />lpDisp = books.Open("E://test.xls",<br />covOptional, covOptional, covOptional, covOptional,<br />covOptional, covOptional, covOptional, covOptional,<br />covOptional, covOptional, covOptional, covOptional,<br />covOptional, covOptional);<br />ASSERT(lpDisp);</p><p>book.AttachDispatch(lpDisp);</p><p>// 得到Worksheets<br />sheets.AttachDispatch(book.GetWorksheets(),true); </p><p>// 得到Worksheet<br />sheet.AttachDispatch(sheets.GetItem(_variant_t((short)(1)))); </p><p>// 得到全部Cells<br />range.AttachDispatch(sheet.GetCells(),true);</p><p>// 往儲存格A1裡寫入字串資料,就像操作矩陣一樣,第1行第1列<br />range.SetItem(_variant_t((LONG)1),_variant_t((LONG)1),_variant_t("hello word!"));</p><p>// 往儲存格A2裡寫入時間資料<br />range.AttachDispatch(sheet.GetRange(_variant_t("A2"), _variant_t("A2")),true);<br />range.SetValue2(_variant_t("2011/02/15"));</p><p>// 往儲存格A3~A6裡寫入浮點數據<br />range.AttachDispatch(sheet.GetRange(_variant_t("A3"), _variant_t("A6")),true);<br />range.SetValue2(_variant_t((double)3.14));</p><p>// 設定儲存格的列寬為12<br />range.AttachDispatch(sheet.GetRange(_variant_t("A1"), _variant_t("A1")),true);<br />range.SetColumnWidth(_variant_t((long)12));</p><p>// 所有儲存格置中顯示<br />range.AttachDispatch(sheet.GetCells(),true);<br />range.SetHorizontalAlignment(_variant_t((long)-4108)); // -4108:置中,-4131:靠左,-4152:靠右<br />range.SetVerticalAlignment(_variant_t((long)-4108)); // -4108:置中,-4160:靠上,-4107:靠下</p><p>// 讀取儲存格的資料,第4行第1列<br />range.AttachDispatch(range.GetItem(_variant_t((long)(4)),_variant_t((long)(1))).pdispVal );<br />vResult =range.GetValue(covOptional);</p><p>switch (vResult.vt)<br />{<br />case VT_BSTR:// 字串<br />str=vResult.bstrVal;<br />break;<br />case VT_R8:// 8位元組的數字<br />str.Format("%f",vResult.dblVal);<br />break;<br />case VT_DATE:// 時間格式<br />SYSTEMTIME st;<br />VariantTimeToSystemTime(vResult.date, &st);<br />break;<br />case VT_EMPTY:// 儲存格空的<br />str="";<br />break;<br />}<br />//MessageBox(str);</p><p>Font ft;// 要插入excel類庫裡面的Font類,下面類似</p><p>range.AttachDispatch(sheet.GetRange(_variant_t("A3"), _variant_t("A5")),true);<br />ft.AttachDispatch(range.GetFont());<br />ft.SetName(_variant_t("華文行楷"));// 字型<br />ft.SetSize(_variant_t((long)12));// 字型大小<br />//ft.SetColorIndex(_variant_t((long)3));// 字的顏色: 紅色<br /> ft.SetColor( _variant_t((long) RGB(255, 0, 0) ) );<br />ft.SetBold(_variant_t((long)1));// 1:粗體,0:非粗體</p><p>Interior it; // 底色設定</p><p>range.AttachDispatch(sheet.GetRange(_variant_t("C3"), _variant_t("E6")),true);<br />it.AttachDispatch(range.GetInterior());<br />it.SetColorIndex(_variant_t((long)20)); // 底色設定為淺青色</p><p>Borders borders; // 先設定地區內所有儲存格的邊框<br />borders = range.GetBorders();<br />borders.SetColorIndex(_variant_t((long)1));<br />borders.SetLineStyle(_variant_t((long)1));<br />borders.SetWeight(_variant_t((long)2));</p><p>// 然後設定外邊框<br />// LineStyle=線型(1~13) Weight=線寬 ColorIndex=線的顏色(-4105為自動, 1為黑色)<br />range.BorderAround(_variant_t((long)9),_variant_t((long)1),_variant_t((long)1),vtMissing);</p><p>range.AttachDispatch(sheet.GetRange(_variant_t("C8"), _variant_t("D9")),true);<br />// 合併儲存格<br />range.Merge(_variant_t((long)0));</p><p>book.Save();// 儲存Excel的內容<br />//app.SetDisplayAlerts(false);// 不彈出對話方塊詢問是否儲存<br />//app.Quit();// 退出</p><p>//釋放對象<br />range.ReleaseDispatch();<br />sheet.ReleaseDispatch();<br />sheets.ReleaseDispatch();<br />book.ReleaseDispatch();<br />books.ReleaseDispatch();<br />app.ReleaseDispatch();

 

      上面就是一些對於Excel的基本操作,如果有什麼問題希望大家能夠指出!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.