邵英安
摘要:本文介紹了在VC++中利用Access數(shù)據(jù)庫,讀取數(shù)據(jù)并且調(diào)用VBA對象來制作復雜Word報表的方法,以及通過具體一個動態(tài)復雜報表實例給出了詳細設(shè)計的實現(xiàn)過程。
關(guān)鍵詞:VC++ Access VBA 報表
0 引言
Visual C++作為一種可視化編程平臺,其一,代碼框架自動生成,用戶交互強,可開發(fā)多種領(lǐng)域的應(yīng)用程序,并支持數(shù)據(jù)庫接口ODBC,以及OLEDB、ADO數(shù)據(jù)庫訪問等,直接調(diào)用底層的驅(qū)動程序?qū)Ω鞣N主流數(shù)據(jù)庫進行訪問,進而在一定程度上提高編程效率。其二,VC++提供了ADO和OLE技術(shù),并為開發(fā)者提供了系統(tǒng)控件及第三方控件,從而實現(xiàn)程序的模塊化。其中ADO是數(shù)據(jù)庫程序開發(fā)接口,主要通過數(shù)據(jù)訪問層OLE DB Provider提供的COM接口訪問數(shù)據(jù),優(yōu)化了數(shù)據(jù)訪問的過程,增加了數(shù)據(jù)訪問的靈活性,是數(shù)據(jù)庫主流的數(shù)據(jù)訪問接口,加大了簡化程序開發(fā)難度。VBA是通用的宏語言,其具有方便靈活高效的特點,并且可被所有的Microsoft 可編程應(yīng)用軟件如Visual C++所共享,即多種應(yīng)用程序使用統(tǒng)一的標準宏語言,極大地提高了編程人員在編程和源代碼上調(diào)試的工作量,提高了工作效率,增強了各種應(yīng)用軟件之間的協(xié)調(diào)開發(fā)和調(diào)用能力。
1 實驗平臺搭建
1.1 初始化ADO環(huán)境:創(chuàng)建一個MFC的一個工程,導入ADO動態(tài)鏈接庫在stdafx.h文件
#import "C:/Program Files/Common Files/System/ado/msado15.dll"no_namespace rename("EOF", "adoEOF")rename("BOF", "adoBOF")然后,并在應(yīng)用程序?qū)ο箢惖某蓡T函數(shù)中BOOL CXXApp::InitInstance()中::CoInitialize(NULL); //以單線程的方式初始化COM對象。
1.2 聲明三個接口,根據(jù)數(shù)據(jù)類型來創(chuàng)建三個智能指針對象,分為指向:連接對象(Connection)、命令對象(Command)和記錄集對象(RecordSet),其接口為_ConnectionPtr接口、_CommandPtr接口、_RecordsetPtr接口。其中_ConnectionPtr接口:返回一個記錄集或一個空指針。_CommandPtr接口:該接口返回一個記錄集,用來執(zhí)行返回記錄集的存儲過程和SQL語句。_RecordsetPtr接口:該接口是一個記錄集對象,可以對記錄集進行記錄鎖定、觸發(fā)器、游標控制等。
_ConnectionPtr m_pConnection ;
_RecordsetPtr m_pRecordset ;
_RecordsetPtr m_pRecordsetFind ; //記錄集對象查找指針。
1.3 創(chuàng)建Connection對象,并設(shè)置數(shù)據(jù)源,訪問數(shù)據(jù)庫,并給出捕獲異常完整代碼
try
{m_pConnection.CreateInstance("ADODB.Connection"); //創(chuàng)建連接對象實例
_bstr_t strConnect="DRIVER={Microsoft Access Driver (*.mdb)}; uid=;pwd=;DBQ=數(shù)據(jù)庫.mdb;";
m_pConnection->Open(strConnect,"","",adModeUnknown);
}
catch (_com_error e)//捕捉錯誤
{ AfxMessageBox(e.Description()); //彈出錯誤
CString mErrorMessage;
mErrorMessage.Format("連接數(shù)據(jù)庫失?。。躵\n錯誤信息:%s",e.ErrorMessage());
AfxMessageBox(mErrorMessage);///顯示錯誤信息
return FALSE;
}
1.4 初始化VBA環(huán)境
1.4.1 OFFICE組件庫:按下快捷鍵Ctrl+W,彈出
MFC ClassWizard對話框,單擊Add Class…,選擇From a type library…,彈出Import from Type Library對話框,找到OFFICE軟件的安裝文件夾,在其中找到MSWORD.OLB(Microsoft Office Word 2003 MSWord.olb)打開,在選類的對話框中中按下Ctrl鍵選中所要選中的類,單擊確定。
1.4.2 導入本工程所需要的頭文件:在實際的應(yīng)用過
程當中,我們主要采用以下幾個類來進行開發(fā),引入頭文件#include "msword.h",Application:代表Microsoft Word 應(yīng)用程序,其中包含可返回最高級對象的屬性和方法。例如:
Documents:由 Word 當前打開的所有 Document(文檔)對象所組成的集合。
Document:代表一篇文檔。Document對象是
Documents 集合中的一個元素。
Selection:該對象代表窗口或窗格中的當前所選內(nèi)容。一個應(yīng)用程序中只能有一個活動的文檔窗格,一個文檔窗格只能以一個活動Selection對象。
1.4.3 創(chuàng)建Word文檔
首先,創(chuàng)建三個變量:COleVariant vTrue((short)TRUE); //真COleVariant vFalse((short)FALSE); //假COleVariant vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
WordApplication::_Application oWordApp; //開始一個新的Microsoft Word實例
if (!oWordApp.CreateDispatch("Word.Application", NULL))
{AfxMessageBox("先安裝Office2003,Createfailed."); return; }
//創(chuàng)建一個新的word文檔
WordApplication::Documents oDocs=oWordApp.GetDocuments();
WordApplication::_Document oDoc=oDocs.Add(vOpt,vOpt,vOpt,vOpt); //創(chuàng)建_Document對象
WordApplication::Selection oSel = oWordApp.GetSelection();//創(chuàng)建Selection 對象
WordApplication::_ParagraphFormat wordFormat=oSel.GetParagraphFormat();//創(chuàng)建_ParagraphFormat對象
1.4.4 創(chuàng)建Word報表的格式
創(chuàng)建表的標題行、設(shè)置字體大小、設(shè)置字體類型、文本居中對齊,并通過打開數(shù)據(jù)庫中指定的表,通過_RecordsetPtr記錄集對象中的GetItem讀取相應(yīng)的數(shù)據(jù),顯示在指定的數(shù)據(jù)控件上。
1.4.5 計算報表中數(shù)據(jù)
首先,定義兩個數(shù)組用來存儲將小寫金額轉(zhuǎn)換成大寫金額,并對所有的物資金額進行統(tǒng)計運算,并且將金額相應(yīng)轉(zhuǎn)化成大寫形式。其相應(yīng)宏命令如下:
Selection.InsertFormula Formula:="=SUM(ABOVE)",NumberFormat:="#,##0.00"進行對輸入表格中的數(shù)據(jù)時行運算, 顯示文檔并激活文檔,保存word文檔,釋放所有對象。
1.4.6 最終生成的數(shù)據(jù)報表
2 結(jié)束語
本文介紹了如何在VC++中利用MFC和VBA,并結(jié)合數(shù)據(jù)庫ACCESS來生成復雜數(shù)據(jù)報表的編程思想和具體詳細的實現(xiàn)過程。實踐證明本文所提供的方法,可以快速高效地創(chuàng)建復雜的數(shù)據(jù)報表,有助于提高編程的效率。
參考文獻:
[1]李婭.清江防洪與梯調(diào)仿真系統(tǒng)數(shù)據(jù)庫設(shè)計研究[D].華中科技大學,2004(04).
[2]任慶臻.基于IEC62305雷擊災(zāi)害風險評估系統(tǒng)的設(shè)計[D].吉林大學,2010(04).
[3]劉曉華.精通MFC[M].電子工業(yè)出版社,2003.
[4]趙輝,葉子青.Visual C++系統(tǒng)開發(fā)實例精粹[M].人民郵電出版社,2005.