摘要: 本文結(jié)合實(shí)例介紹了在VB中利用Excel實(shí)現(xiàn)復(fù)制報(bào)表的設(shè)計(jì)的方法,該方法把VB強(qiáng)大數(shù)據(jù)庫管理與Excel靈活的報(bào)表設(shè)計(jì)有機(jī)結(jié)合起來,簡化了編程,提高了程序的便利性。
關(guān)鍵詞: Visual Basic Excel 報(bào)表
引言
在數(shù)據(jù)庫應(yīng)用中,數(shù)據(jù)報(bào)表是非常重要的部分,Visual Basic中的數(shù)據(jù)報(bào)表器可以很方便地創(chuàng)建數(shù)據(jù)報(bào)表,但由數(shù)據(jù)報(bào)表器設(shè)計(jì)的表格樣式單一,功能較少。微軟公司的Excel軟件想必大家都很熟悉,它那強(qiáng)大的報(bào)表設(shè)計(jì)功能和簡單的操作界面,給大家留下了很深的印象。若能把VB中的數(shù)據(jù)輸出至Excel格式的報(bào)表中,使得VB的數(shù)據(jù)庫管理功能與Excel的報(bào)表設(shè)計(jì)功能結(jié)合起來,將大大方便普通用戶的使用。本文借助一個(gè)實(shí)例詳細(xì)介紹VB中如何利用Excel進(jìn)行報(bào)表設(shè)計(jì)的方法。
1.Excel對(duì)象
借助Excel對(duì)象,可以很方便地在VB數(shù)據(jù)庫程序中生成Excel報(bào)表。應(yīng)用程序的最終用戶在Excel環(huán)境中對(duì)報(bào)表做進(jìn)一步的處理,如格式修改、打印預(yù)覽、打印及保存等。
Excel對(duì)象封裝了Microsoft Excel的全部對(duì)象,我們主要使用其中的五種對(duì)象,詳細(xì)介紹如下。
Application對(duì)象:表示Excel應(yīng)用對(duì)象,可以控制Excel應(yīng)用程序的外觀或功能[1],是訪問Excel其他對(duì)象的切入點(diǎn)。
Workbook對(duì)象:表示Excel中的工作簿,即對(duì)應(yīng)一個(gè)Excel文件,可以實(shí)現(xiàn)對(duì)Excel工作簿的各種控制[1]。
Worksheet對(duì)象:表示Excel中的工作表,可以實(shí)現(xiàn)對(duì)Excel工作表的各種控制[1]。
Range對(duì)象:表示Excel中的區(qū)間,例如可以代表Excel中的某一單元格、某一行、某一列、某一選定區(qū)域[1]。
Cells對(duì)象:表示Excel中的一個(gè)單元格[2],通過該對(duì)象讀取Excel中的數(shù)據(jù)或?qū)?shù)據(jù)寫入Excel中。
2.操作步驟
在VB中借助Excel生成報(bào)表,需完成如下工作:
(1)在Excel中制作報(bào)表模板,設(shè)計(jì)報(bào)表標(biāo)題、表頭的樣式,包括字體字號(hào)、邊框等等。生成報(bào)表的過程實(shí)質(zhì)上就是拷貝該模板并在新文件中填入具體的數(shù)據(jù)。
(2)在VB中引用Excel對(duì)象[1]。首先在工程中選擇“工程”→“引用”,并選擇“Microsoft Excel 11.0 Object Library”。
(3)在工程中使用New關(guān)鍵字聲明Excel對(duì)象[1]。例如語句Dim n_xls As New Excel.Application聲明了Excel對(duì)象n_xls。
(4)使用Excel對(duì)象的屬性和方法設(shè)計(jì)報(bào)表[1]。例如語句.Cells(1,1)=″常州技師學(xué)院″實(shí)現(xiàn)在A1單元格中寫入數(shù)據(jù)。
(5)保存文件,釋放Excel對(duì)象。例如語句n_xls.Quit釋放Excel對(duì)象。
3.實(shí)例
下面以常州技師學(xué)院招生系統(tǒng)中新生資料(分班)報(bào)表的設(shè)計(jì)為例,詳細(xì)介紹VB中巧用Excel實(shí)現(xiàn)報(bào)表設(shè)計(jì)的過程。本實(shí)例生成新生資料總表和分表,可實(shí)現(xiàn)自動(dòng)分頁功能,所有數(shù)據(jù)一次打印,工作人員無需守候在打印機(jī)旁,分表中為一個(gè)班級(jí)新生資料,便于日后單個(gè)班級(jí)資料的打印工作。
首先在Excel中制作如圖一的模板文件“新生資料(分班).xls”,保存在專用文件夾data中。

下面就以圖一為例,說明在VB中是實(shí)何利用Excel實(shí)現(xiàn)報(bào)表設(shè)計(jì)的,窗體中的重點(diǎn)部分程序代碼如下:
Dim gzApp As New Excel.Application″聲明Excel對(duì)象gzApp
Dim gzWorkbook As New Excel.Workbook″聲明工作簿對(duì)象gzWorkbook
Dim gzWorkSheet As New Excel.Worksheet″聲明工作表對(duì)象gzWorkSheet
Dim range1 As Excel.Range″聲明區(qū)間對(duì)象range1
Dim fname As String″fname變量用來存放生成的文件名,包括年份及生成日期
fname=″臨時(shí)″ Trim(Str(Year(Date)))″新生資料(分班)_″ Date
″拷貝模板文件得到新的報(bào)表文件
FileCopy App.Path+″\data\新生資料(分班).xls″,App.Path+″\data\″ fname ″.xls″
Set gzWorkbook=gzApp.Workbooks.Open(App.Path+″\data\″ fname ″.xls″,F(xiàn)alse,True)
Dim i As Integer″新增各班級(jí)工作表,重命名為班級(jí)名稱,班級(jí)名稱在列表List2中
Set gzWorkSheet=Sheets(1)
For i=1 To List2.ListCount
gzWorkSheet.Copy after:=Sheets(i)
Next
For i=0 To List2.ListCount-1
Set gzWorkSheet=Sheets(i+2)
gzWorkSheet.Select
gzWorkSheet.Name=List2.List(i)
Next
″存放班級(jí)總?cè)藬?shù),在總表中起始位置及結(jié)束行數(shù)
Dim bj_number(100)As Integer,bj_start(100)As Integer,bj_end(100)As Integer
″填寫總表數(shù)據(jù)
Set gzWorkSheet=Sheets(1)
gzWorkSheet.Activate
With gzWorkSheet
……
″實(shí)現(xiàn)自動(dòng)分頁,變量hs表示當(dāng)前的行數(shù)
hs_char=″A″ Trim(Str(hs+1))
gzApp.ActiveSheet.Range(hs_char).Select
gzWorkSheet.HPageBreaks.Add Before:=ActiveCell
″表頭格式的復(fù)制及內(nèi)容的填寫
gzApp.ActiveSheet.Range(Cells(1,1),Cells(3,8)).Copy_
Destination:=.Range(Cells(hs+1,1),Cells(hs+3,8))
.Cells(hs-2,1)=Trim(Str(Year(Date)))″年常州技師學(xué)院新生資料(分班)表″
.Cells(hs-1,2)=List2.List(k)
.Cells(hs-1,6)=rs_temp″班級(jí)人數(shù)、男生人數(shù)和女生人數(shù)信息
.Cells(hs-1,8)=″第″ bj_page_n ″頁″
……
″數(shù)據(jù)行的格式復(fù)制
gzApp.ActiveSheet.Range(Cells(4,1),Cells(4,8)).Copy_
Destination:=.Range(Cells(hs,1),Cells(hs,8))
hs_char=″A″Trim(Str(hs))″:H″ Trim(Str(hs))
Set range1=gzApp.ActiveSheet.Range(hs_char)
range1.ClearContents
Set range1=Nothing
″寫入數(shù)據(jù)
.Cells(hs,1)=Trim(rs.Fields(″order_no″))
.Cells(hs,2)=Trim(rs.Fields(″xm″))
.Cells(hs,3)=Trim(rs.Fields(″xb″))
.Cells(hs,4)=Trim(rs.Fields(″byxx″))
.Cells(hs,5)=Trim(rs.Fields(″csny″))
If(rs.Fields(″is_zs″))Then.Cells(hs,6)=“是”
.Cells(hs,7)=Trim(rs.Fields(″lsr″))
.Cells(hs,8)=Trim(rs.Fields(″addr″))
……
End With
Dim gzWorkSheet_n As Excel.Worksheet″從總表中拷貝數(shù)據(jù)至各分表
Dim myrange1 As Range,myrange2 As Range
For k=0 To List2.ListCount-1
Set gzWorkSheet=Sheets(1)
Set gzWorkSheet_n=Sheets(k+2)
gzWorkSheet.Activate
Set myrange1=gzApp.ActiveSheet.Range(Cells(bj_start(k),1),Cells(bj_end(k),8))
myrange1.Copy
gzWorkSheet_n.Activate
myrange2.Activate
myrange2.PasteSpecial
Clipboard.Clear
Next
For k=0 To List2.ListCount-1″各分表分頁,每頁42行
If bj_number(k)>42-3 Then
Set gzWorkSheet_n=Sheets(k+2)
gzWorkSheet_n.Activate
For i=1 To(bj_end(k)-bj_start(k))\42
hs_char=“A” Trim(Str(42*i+1))
gzApp.ActiveSheet.Range(hs_char).Select
gzWorkSheet_n.HPageBreaks.Add Before:=ActiveCell
Next
End If
Next
″刪除臨時(shí)文件,保存文件,釋放Excel對(duì)象
Kill App.Path+″\data\″ fname ″.xls″
fname=Mid(fname,3)
gzWorkbook.SaveAs App.Path+″\data\″ fname ″.xls″
gzWorkbook.Close:gzApp.Quit
4.總結(jié)
在VB中利用Excel實(shí)現(xiàn)報(bào)表設(shè)計(jì),不僅減少了報(bào)表設(shè)計(jì)的工作量,還使生成的報(bào)表擺脫了以往簡單死板的感覺,取而代之的是功能齊全、靈活多變的風(fēng)格。這種方法既利用了Visual Basic強(qiáng)大的數(shù)據(jù)庫管理功能,又利用了Excel靈活的報(bào)表設(shè)計(jì)功能,互相配合,取長補(bǔ)短。
參考文獻(xiàn):
[1]明日科技.Visual Basic開發(fā)技術(shù)大全.北京:人民郵電出版社,第1版.
[2]劉丹丹,胡彩虹,張成才.基于Excel和數(shù)據(jù)庫在VB中制作報(bào)表.氣象與環(huán)境科學(xué),2007,(8):90-93.
[3]王瑾瑜,王曉利,恩和門德,杜偉.基于VB和Excel的報(bào)表設(shè)計(jì)及打印.內(nèi)蒙古電大學(xué)刊,2006,(4):50-51.
[4]陳軍,李凌云.利用VB實(shí)現(xiàn)復(fù)雜數(shù)據(jù)報(bào)表的輸出.煙臺(tái)師范學(xué)院學(xué)報(bào),2004,20,(1):27-30.
[5]馮詩齊.用Excel生成VB應(yīng)用軟件的報(bào)表.電腦學(xué)習(xí),2004,(3):52-54.