摘 要: 介紹了在VC中結(jié)合Excel創(chuàng)建和打印格式比較復(fù)雜的報(bào)表的具體方法。
關(guān)鍵詞: VC Excel 報(bào)表設(shè)計(jì)
在數(shù)據(jù)庫管理系統(tǒng)的開發(fā)以及一些涉及到報(bào)表制作的應(yīng)用領(lǐng)域,各種復(fù)雜格式的報(bào)表處理是一項(xiàng)煩瑣的工作。目前利用計(jì)算機(jī)輔助制作各種報(bào)表的方法基本都是在VB環(huán)境下操作的。事實(shí)上,VC作為另外一種功能強(qiáng)大的開發(fā)工具,在數(shù)據(jù)管理和操作方面同樣具有強(qiáng)大的功能,并提供了多種方式進(jìn)行報(bào)表處理。例如可以先創(chuàng)建一個(gè)指向打印機(jī)的設(shè)備環(huán)境句柄,通過該句柄調(diào)用相關(guān)的繪圖函數(shù),繪制空報(bào)表模版,并動態(tài)填入數(shù)據(jù),輸出到打印機(jī)上。用這種方法制作格式簡單的報(bào)表時(shí)很方便,但是當(dāng)碰到格式復(fù)雜的報(bào)表時(shí),用Excel的電子表格制作功能結(jié)合VC的強(qiáng)大數(shù)據(jù)處理能力,將大大簡化復(fù)雜表格的設(shè)計(jì)制作工作。
1 實(shí)現(xiàn)方法
1.1 利用Excel創(chuàng)建報(bào)表的模版文件
Excel具有強(qiáng)大的電子表格制作功能,利用其單元格的拆分、合并和格式設(shè)定,可以方便、快捷地繪制空白表格文檔,并可以隨時(shí)根據(jù)實(shí)際情況,重新設(shè)定報(bào)表格式,生成滿足用戶要求的模版文件。例如,當(dāng)需要打印成百上千張格式一致的學(xué)生信息統(tǒng)計(jì)表時(shí),若需要改變表格格式,只需要將模版文件稍加修改即可。
生成的工作表中每個(gè)單元格都有相應(yīng)的編號,如“A9”和“G3”分別代表工作表中的A列第9行和G列第3行所對應(yīng)的單元格。像這樣記錄要填充內(nèi)容的單元格編號與要填充的數(shù)據(jù)字段是必要的。例如,設(shè)計(jì)一個(gè)學(xué)生信息卡,其格式如圖1所示。

工作表中需要填姓名、性別和民族數(shù)據(jù)的單元格對應(yīng)列為C列,年齡、籍貫和政治面貌對應(yīng)E列,入學(xué)時(shí)間、所在系別和專業(yè)對應(yīng)G列,其中行的編號為4~6,這樣就形成了一個(gè)模版文件。
在程序中不需要直接操作模版文件,只需要將模版文件拷貝到一個(gè)副本中進(jìn)行操作即可。在VC中進(jìn)行文件操作不如在VB中方便。一種方法是直接利用CFile 類的操作成員函數(shù)來實(shí)現(xiàn),但操作復(fù)雜。另一種有效的方法是利用Win32 API函數(shù)來實(shí)現(xiàn)對于文件的操作,例如要向第1列空白單元格填充學(xué)生姓名、性別和民族數(shù)據(jù),則具體實(shí)現(xiàn)代碼如下:
int nOk;
char strSrc[ ]=″...\\student.xls\0″; //源文件路徑,省略號代表文件所在的相對路徑
char strDst[ ]=″...\\studentbak.xls\0″; //目標(biāo)文件路徑
char strTitle[ ]=″File copying″; //進(jìn)度題頭
SHFILEOPSTRUCT FileOp;
FileOp.hwnd=m_hWnd;
FileOp.wFunc=FO_COPY; //執(zhí)行文件拷貝,將模版文件拷貝到臨時(shí)文件中
FileOp.pFrom=strSrc;
FileOp.pTo=strDst;
FileOp.fFlags=FOF_ALLOWUNDO;
FileOp.hNameMappings=NULL;
FileOp.lpszProgressTitle=strTitle;
nOk=SHFileOperation(&FileOp);
if(nOk)
TRACE(″There is an error:%d\n″,nOk);
else
TRACE(″SHFileOperation finished successfully\n″);
if(FileOp.fAnyOperationsAborted)
TRACE(″Operation was aborted!\n″);
1.2 將數(shù)據(jù)放入模版文件副本相應(yīng)單元格中
(1)在程序中導(dǎo)入mso9.dll、vbe6ext.olb和Excel9.olb庫文件。
在需要調(diào)用Excel報(bào)表文檔的程序代碼所在的.Cpp文件頭,加入下面的代碼:
#import <mso9.dll> no_namespace rename(″Document-
Properties″,DocumentPropertiesXL″)
#import <vbe6ext.olb> no_namespace
#import <Excel9.olb> rename(″DialogBox″,″DialogBoxXL″)
rename(″RGB″,″RBGXL″) rename(″DocumentProperties″,
″DocumentPropertiesXL″) no_dual_interfaces
同時(shí)要在VC工具欄的工具菜單中點(diǎn)擊“選擇菜單”項(xiàng),在彈出的選擇對話框中選擇目錄標(biāo)簽,指定mso9.dll、vbe6ext.olb和Excel9.olb文件所在的目錄,否則程序?qū)幾g錯(cuò)誤,提示找不到這些庫文件。默認(rèn)情況下mso9.dll和Excel9.olb文件在Office安裝目錄下,而vbe6ext.olb文件在系統(tǒng)文件夾的共享文件中的VBA目錄下。
(2)聲明并建立對Excel應(yīng)用程序、工作簿和工作表對象變量的引用。
using namespace Excel;
_ApplicationPtr pXL;
pXL->CreateInstance(L″Excel.Application.9″);
//創(chuàng)建Excel應(yīng)用實(shí)例
pXL->Visible=VARIANT_TRUE;
_WorkbooksPtr pBooks=pXL->Workbooks;
_WorkbookPtr pBook=pBooks->Open(″..\\studentbak.xls″);
//打開已創(chuàng)建的臨時(shí)模版文件
_WorksheetPtr pSheet=pXL->ActiveSheet;//設(shè)定當(dāng)前
//工作表
pSheet->Name=″student″;//命名當(dāng)前工作表
(3)將數(shù)據(jù)填入工作表相應(yīng)單元格。
如果要操作的數(shù)據(jù)在學(xué)生信息數(shù)據(jù)庫的學(xué)生信息表中,則定義1個(gè)CRecordSet對象變量m_bSet,并用該變量操作數(shù)據(jù)庫中的數(shù)據(jù)(有關(guān)數(shù)據(jù)庫操作的細(xì)節(jié)見相關(guān)書籍)。給單元格賦值的具體代碼如下:
m_bSet.MoveFirst( );
do { CString row;
char h [20];
_itoa(k,h,10);//將整形變量轉(zhuǎn)換為字符變量
row=h;
CString nsc=″C″+″4″;//填充姓名的單元格編號
CString ahd=″C″+″5″;//填充性別的單元格編號
CString ymn=″C″+″6″;//填充民族的單元格編號
//在將上述字符串變量作為單元格編號使用以前,需要進(jìn)
//行強(qiáng)制類型轉(zhuǎn)化,否則將出錯(cuò)
_variant_t na,ma,ph;
na=(_variant_t) (nsc);
ma=(_variant_t) (ahd);
ph=(_variant_t) (ymn);
pSheet->Range[na]->Value=(_variant_t) (m_bSet.Stuname);
//填充學(xué)生姓名數(shù)據(jù)
pSheet->Range[ma]->Value=(_variant_t) (m_bSet.Stusex);
//填充學(xué)生性別
pSheet->Range[ph]->Value=(_variant_t) (m_bSet.Stunation);
//填充學(xué)生民族
m_bSet.MoveNext( );
} while(!m_bSet.IsEOF( ));
m_bSet.Close( );
程序?qū)⒁恢眻?zhí)行,直到把數(shù)據(jù)庫中的數(shù)據(jù)讀取完畢。
1.3 報(bào)表打印
試驗(yàn)報(bào)表數(shù)據(jù)填寫完成后的打印工作可以用下面的語句直接實(shí)現(xiàn)。但注意在打印之前應(yīng)對Excel臨時(shí)文件執(zhí)行一次保存操作。
pBook->Saved=VARIANT_TRUE;//保存文件
pSheet->PrintOut( );//打印報(bào)表
pBook->Close( );//關(guān)閉表單
pXL->Quit( );//退出Excel
由于打印工作是后臺操作,因此用戶看不到具體實(shí)現(xiàn)過程,只能看到報(bào)表從打印機(jī)中被打印出來。
2 結(jié)束語
報(bào)表制作和打印的方法多種多樣,本文介紹了用VC結(jié)合Excel實(shí)現(xiàn)復(fù)雜報(bào)表制作的具體方法,該方法能高效、快捷地解決實(shí)際問題。
參考文獻(xiàn)
1 徐雄.在VB中調(diào)用Excel實(shí)現(xiàn)票據(jù)套打.計(jì)算機(jī)應(yīng)用, 2001;(9)
2 北京源江科技開發(fā)公司制作.Visual C++編程資源大全(光 盤版).北京:北京萬水電子信息有限公司出版社,2001
3 官章全,唐小衛(wèi).Visual C++ 6.0編程實(shí)例詳解.北京:電子工業(yè)出版社,2001
