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

工作表中需要填姓名、性別和民族數(shù)據(jù)的單元格對應(yīng)列為C列,年齡、籍貫和政治面貌對應(yīng)E列,入學(xué)時間、所在系別和專業(yè)對應(yīng)G列,其中行的編號為4~6,這樣就形成了一個模版文件。
在程序中不需要直接操作模版文件,只需要將模版文件拷貝到一個副本中進行操作即可。在VC中進行文件操作不如在VB中方便。一種方法是直接利用CFile 類的操作成員函數(shù)來實現(xiàn),但操作復(fù)雜。另一種有效的方法是利用Win32 API函數(shù)來實現(xiàn)對于文件的操作,例如要向第1列空白單元格填充學(xué)生姓名、性別和民族數(shù)據(jù),則具體實現(xiàn)代碼如下:
int nOk;
char strSrc[ ]=″...\\student.xls\0″; //源文件路徑,省略號代表文件所在的相對路徑
char strDst[ ]=″...\\studentbak.xls\0″; //目標文件路徑
char strTitle[ ]=″File copying″; //進度題頭
SHFILEOPSTRUCT FileOp;
FileOp.hwnd=m_hWnd;
FileOp.wFunc=FO_COPY; //執(zhí)行文件拷貝,將模版文件拷貝到臨時文件中
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報表文檔的程序代碼所在的.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
同時要在VC工具欄的工具菜單中點擊“選擇菜單”項,在彈出的選擇對話框中選擇目錄標簽,指定mso9.dll、vbe6ext.olb和Excel9.olb文件所在的目錄,否則程序?qū)幾g錯誤,提示找不到這些庫文件。默認情況下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)用實例
pXL->Visible=VARIANT_TRUE;
_WorkbooksPtr pBooks=pXL->Workbooks;
_WorkbookPtr pBook=pBooks->Open(″..\\studentbak.xls″);
//打開已創(chuàng)建的臨時模版文件
_WorksheetPtr pSheet=pXL->ActiveSheet;//設(shè)定當前
//工作表
pSheet->Name=″student″;//命名當前工作表
(3)將數(shù)據(jù)填入工作表相應(yīng)單元格。
如果要操作的數(shù)據(jù)在學(xué)生信息數(shù)據(jù)庫的學(xué)生信息表中,則定義1個CRecordSet對象變量m_bSet,并用該變量操作數(shù)據(jù)庫中的數(shù)據(jù)(有關(guān)數(shù)據(jù)庫操作的細節(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″;//填充民族的單元格編號
//在將上述字符串變量作為單元格編號使用以前,需要進
//行強制類型轉(zhuǎn)化,否則將出錯
_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 報表打印
試驗報表數(shù)據(jù)填寫完成后的打印工作可以用下面的語句直接實現(xiàn)。但注意在打印之前應(yīng)對Excel臨時文件執(zhí)行一次保存操作。
pBook->Saved=VARIANT_TRUE;//保存文件
pSheet->PrintOut( );//打印報表
pBook->Close( );//關(guān)閉表單
pXL->Quit( );//退出Excel
由于打印工作是后臺操作,因此用戶看不到具體實現(xiàn)過程,只能看到報表從打印機中被打印出來。
2 結(jié)束語
報表制作和打印的方法多種多樣,本文介紹了用VC結(jié)合Excel實現(xiàn)復(fù)雜報表制作的具體方法,該方法能高效、快捷地解決實際問題。
參考文獻
1 徐雄.在VB中調(diào)用Excel實現(xiàn)票據(jù)套打.計算機應(yīng)用, 2001;(9)
2 北京源江科技開發(fā)公司制作.Visual C++編程資源大全(光 盤版).北京:北京萬水電子信息有限公司出版社,2001
3 官章全,唐小衛(wèi).Visual C++ 6.0編程實例詳解.北京:電子工業(yè)出版社,2001
