肖 峰
(1.安徽大學(xué);2.安徽職業(yè)技術(shù)學(xué)院 學(xué)生處,安徽 合肥 230001)
?
VC++讀寫Excel的接口和應(yīng)用研究
肖峰1,2
(1.安徽大學(xué);2.安徽職業(yè)技術(shù)學(xué)院學(xué)生處,安徽合肥230001)
摘要:電子表格軟件Excel以其操作簡單、功能強大,在社會中得到了廣泛的應(yīng)用.文章通過研究COM技術(shù),研究了EXCEL的接口函數(shù),借助面向?qū)ο缶幊坦ぞ遃C++,制作了功能齊全而強大的Excel文件操作類;使程序開發(fā)人員能夠?qū)⒆⒁饬杏谛枰鉀Q的問題,而不是如何操作Excel文件上.并結(jié)合實際教學(xué)工作中經(jīng)常遇到的學(xué)生成績統(tǒng)計為例,全面介紹了一個系統(tǒng)完整的實現(xiàn)過程,對數(shù)據(jù)報表的處理和更高級別的具體應(yīng)用具有一定的借鑒意義.
關(guān)鍵詞:VC++;Excel;COM;數(shù)據(jù)處理
在當(dāng)前的程序設(shè)計中,不僅僅需要進行繁雜的數(shù)學(xué)計算和邏輯處理,而且也需要對數(shù)據(jù)的輸入和輸出以報表或者表格的形式來存儲.Visual C++作為比較常用的可視化開發(fā)工具,具有良好的計算處理、靈活的界面設(shè)計和多樣化的接口處理等功能,并且在代碼效率和執(zhí)行效率上有優(yōu)異的表現(xiàn).但是在對一些數(shù)據(jù)和報表的處理上,很難達到讓人非常滿意的效果.電子表格軟件Excel是office辦公軟件的重要成員.作為一種簡單易用、功能強大的辦公軟件,在社會上得到越來越廣泛的應(yīng)用.所以,將VC++和Excel結(jié)合起來,在程序中實現(xiàn)數(shù)據(jù)的輸入和輸出具有非常重要的價值.
文中程序均已經(jīng)在VC++2010下編譯通過,并能夠在Excel 2007下完成指定功能.
COM(Component Object Model)技術(shù)是微軟公司提出的一種接口和應(yīng)用實現(xiàn)的規(guī)范.Excel就是一種基于COM技術(shù)的應(yīng)用程序,通過特定的接口可將其內(nèi)部對象開放給其他應(yīng)用程序,這樣外部程序就可以通過這些接口來實現(xiàn)對Excel中的對象模型進行操作.
要通過COM技術(shù)對Excel對象進行操作,必須與Excel對象模型提供的對象進行交互,Excel的對象模型中有超過100個對象模型,程序設(shè)計中常用的對象有Application、Workbook、Worksheet、Range等:
Application:代表Excel,處于模型的最上層.
Workbook:指Excel中的工作簿,相當(dāng)于通常所說的Excel文件.需要注意的是,Workbook中包括Worksheet. Worksheet是Workbook中獨立的頁,可以有多個,數(shù)據(jù)就保存在Worksheet中.
Worksheet:Worksheet中包括單元格(Cell).Worksheets是所有Worksheet對象的集合.
Range:Excel中基本的操作是通過對范圍(Range)對象進行處理而實現(xiàn)的.Range是指一個或者多個連續(xù)的單元格區(qū)域.
一般來說,操作Excel對象的步驟如下:(1)建立Application對象.
(2)建立Workbooks對象.
(3)建立Workbook和Worksheet對象.
(4)通過調(diào)用Worksheet對象的方法和屬性操作文件中的詳細(xì)內(nèi)容.
(5)依次關(guān)閉Worksheet、Workbook、Workbook是和Application對象.
在使用Excel對象之前,必須插入一個Excel類,步驟如下:
(1)建立一個標(biāo)準(zhǔn)的基于MFC的工程.
(2)在工程名上點擊鼠標(biāo)右鍵,選擇”Add→Class”,在彈出的對話框中選擇”MFC Class From TypeLib”會彈出一個導(dǎo)入對話框.
(3)在”Available type libraries:”選擇框中選擇”Microsoft Excel 12.0 type Library<1.6>”,Interfaces列表框中會出現(xiàn)excel所有的對象模型.在列表框中的對象模型里選擇我們需要的類.
(4)進入幾個剛生成的類頭文件中將”#import”開頭的這行注釋掉.
這樣我們就把Excel對象模型中的對象導(dǎo)入到VC++中了.
為了在VC++實現(xiàn)方便快捷的操作Excel,我們可以對這些導(dǎo)入的Excel對象模型的方法和屬性進一步的包裝和抽象,使其調(diào)用更加簡單.
創(chuàng)建一個新的類CExcelLib,在這個類中實現(xiàn)Excel的所有操作.CExcelLib類直接調(diào)用Excel內(nèi)部函數(shù),完成讀取、寫入、保存和設(shè)置格式等操作.
3.1初始化Excel對象
在這里我們可以在類CExcelLib的構(gòu)造函數(shù)中創(chuàng)建Excel.Application對象,如果創(chuàng)建成功,則使用已經(jīng)完成初始化的Application對象m_Excel創(chuàng)建工作簿組對象并將其關(guān)聯(lián)到類成員變量m_bojBooks.
3.2打開和創(chuàng)建Excel文件
通過文件名在已經(jīng)完成初始化的Workbooks對象打開對應(yīng)的工作簿(Workbook)并將其關(guān)聯(lián)到成員變量m_Book.
m_Book=m_Books.Open(szFileName, vt, vt, vt,vt, vt, vt, vt, vt,vt, vt, vt, vt, vt, vt);
如果是創(chuàng)建一個新文件則使用如下的方法.通過加載excel空白模板的方式,創(chuàng)建一個excel文件,默認(rèn)的文件名是Book1.
m_Book = m_Books.Add(vt);
經(jīng)初始化成功的workbook對象獲取表單對象集(Worksheets)并將之關(guān)聯(lián)到一個Worksheets變量上,通過枚舉的方式查找和指定表單名匹配的worksheet,并將它關(guān)聯(lián)到成員變量m_Sheet.
如果是創(chuàng)建一個新表單,可以采用如下的代碼來創(chuàng)建一個指定名字的新表單.
Worksheets objSheets = m_Book.GetWorksheets();
m_Sheet = objSheets.Add(vt,vt,vt,vt);
m_Sheet.SetName(szSheetName);
這步完成后,我們已經(jīng)把一個excel文件操作所需要的對象均已構(gòu)建、關(guān)聯(lián)完畢.
3.3單元格操作
(1)合并/解除合并單元格
合并單元格是Excel經(jīng)常用到的操作,輸入?yún)?shù)有四個,前兩個參數(shù)是開始位置單元格的行號和列號,后兩個參數(shù)是結(jié)束單元格的行號和列號.
Range objRange=m_Sheet.GetRange (Variant (rc2a1 (ROW1,COL1)), OleVariant(rc2a1(ROW2, COL2)));
objRange.Merge(vt);
除合并單元格的方法和合并單元格的方法類似.
(2)填寫單元格內(nèi)容
把預(yù)先定義的值填寫到指定的某一單元格中.因為參數(shù)中傳入的值僅支持字符串類型的值,需要我們事先把其他類型的值轉(zhuǎn)為字符串形式,然后再填寫到指定的單元格中.
m_Range.SetItem(Variant(lRow), Variant(lCol), Variant (szText));
用類似的方法可以讀取表單中指定單元格的內(nèi)容. (3)設(shè)置背景色
設(shè)置指定的一個單元格或者多個單元格的背景色.
Range objRange=m_Sheet.GetRange (Variant (rc2a1 (ROW1, COL1)),Variant(rc2a1(ROW2,COL2)));
((Interior)objRange.GetInterior ()).SetColor (_variant_t ((long)Color));
(4)設(shè)置對齊方式
設(shè)置指定單元格的對齊方式,可以同時指定單個或者多個單元格.同時對單元格的水平和垂直對齊方式進行設(shè)定.如果水平或者垂直對齊方式的輸入值是0,則認(rèn)為是不對此方向上的對齊方式作出新的設(shè)定.水平對齊常用的值有:1默認(rèn)對齊方式,-4108居中對齊,-4131左對齊,-4152右對齊.垂直對齊常用的值有:2默認(rèn)對齊方式,-4108居中對齊,-4160左對齊,-4107右對齊.
關(guān)于單元格的操作還有很多,比如設(shè)置字體的大小、顏色,設(shè)置行高、列寬以及在指定的單元格設(shè)置邊框等等,這里不再一一詳細(xì)描述.
3.4保存和退出
當(dāng)把Excel的內(nèi)容編輯完成之后,保存的時候傳入指定的文件路徑,調(diào)用SaveAs功能把整個文件保存到電腦上.
Excel在退出的時候必須按照指定的順序釋放對象:
m_Range.ReleaseDispatch();
m_Sheet.ReleaseDispatch();
m_Book.ReleaseDispatch();
m_Books.ReleaseDispatch();
delete m_Excel;
下面以教學(xué)工作中經(jīng)常能遇到的學(xué)生考試成績統(tǒng)計為例來說明如何使用VC++來操作Excel文件.
(1)假設(shè)學(xué)生信息數(shù)據(jù)庫存儲著學(xué)生姓名、學(xué)號、班級、科目、考試分?jǐn)?shù)等信息,也可以從相關(guān)聯(lián)的數(shù)據(jù)庫中查到授課老師的信息,我們可以把這些信息都導(dǎo)出到Excel文件中.
(2)執(zhí)行導(dǎo)出操作將數(shù)據(jù)到Excel文件.
假設(shè)我們已經(jīng)定義CExcelLib的成員變量實例.并且已經(jīng)關(guān)聯(lián)到本地空白的excel文件,然后把從數(shù)據(jù)庫中得到的信息寫入excel文件中.
先創(chuàng)建一個Excel對象和三個工作表,分別是數(shù)學(xué)、英語和網(wǎng)絡(luò),并且把數(shù)學(xué)表單激活作為當(dāng)前的工作表單.并且對表頭進行簡單的設(shè)置.
假設(shè)已經(jīng)獲取數(shù)據(jù)庫連接對象,對數(shù)據(jù)庫中的學(xué)生學(xué)號、姓名、成績進行讀取,并對成績進行判斷,如果60分以上為及格,否則不及格.
這些操作完成后,整個輸出過程全部完成.
通過上面的代碼把指定某個班級全部學(xué)生數(shù)學(xué)這門課程的考試分?jǐn)?shù)信息全部輸出到Excel文件.使用類似的操作可以把英語和網(wǎng)絡(luò)的成績統(tǒng)計輸出到Excel文件中.
當(dāng)這些操作全部完成后,調(diào)用保存函數(shù)把當(dāng)前文件保存為指定的文件名.
(3)數(shù)據(jù)輸入
當(dāng)Excel文件作為外部數(shù)據(jù)輸入源,需要把文件中的大批量的數(shù)據(jù)存儲到數(shù)據(jù)庫時,使用程序設(shè)計也可以使這一過程大大方便和簡化.
基本的處理過程是使用類CExcelLib把數(shù)據(jù)逐條讀出來,經(jīng)過一定的處理后把這些數(shù)據(jù)通過數(shù)據(jù)連接寫入數(shù)據(jù)庫,直到Excel文件中的數(shù)據(jù)被全部讀完.這樣所有的數(shù)據(jù)就都被保存到數(shù)據(jù)庫了.
本文使用VC++實現(xiàn)操作Excel文件,并把具體的操作方法封裝為一個類,并應(yīng)用此類完成學(xué)??荚嚦煽兘y(tǒng)計的運算處理工作.Excel是一種功能強大、界面友好的電子表格工具軟件,當(dāng)用戶處理的數(shù)據(jù)量不是特別大的時候,使用Excel會使工作變得更簡單;但隨著數(shù)據(jù)量的增大,特別是處理大批量重復(fù)性數(shù)據(jù)時,就會顯得效率比較低下.因此,使用程序設(shè)計來完成這種工作具有實用性和必要性.
參考文獻:
〔1〕郝建,張紅瑞,呂延崗.VC++和Excel對象接口的研究與應(yīng)用[J].石家莊鐵道學(xué)院學(xué)報(自然科學(xué)版),2009,22(4): 75-78.
〔2〕杜詩雨,王子源.Visual C++操作Excel的應(yīng)用研究[J].計算機與現(xiàn)代化,2011(8):201-203.
〔3〕王文會,陳靜,嚴(yán)翠玲.VC++中用Excel實現(xiàn)數(shù)據(jù)庫表的導(dǎo)入與導(dǎo)出[J].河北工業(yè)科技,2008,25(6):382-385.
〔4〕潘愛民.COM原理與應(yīng)用[M].北京:清華大學(xué)出版社,1999.
〔5〕潘愛民,等譯.Visual C++技術(shù)內(nèi)幕(第4版)[M].北京:清華大學(xué)出版社,2004.
收稿日期:2015年10月19日
中圖分類號:TP317.3
文獻標(biāo)識碼:A
文章編號:1673-260X(2016)02-0016-02