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