摘要:本文介紹在Visual Basic程序中,利用Visual Basic操作Microsoft Excel,通過一個可攜帶記錄集參數的過程,實現對結構不同、標題不同的各類數據表的打印;克服了Visual Basic報表設計功能的局限性,解決了在程序運行中,動態生成的各種結構不同的記錄集對應的數據表的打印輸出問題;統一并簡化了Visual Basic應用程序對各類不同結構數據表的設計及打印的實現方法。
關鍵詞:Visual Basic;Excel;數據表;打印
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)09-11669-04
The VB Program Design: Universal Procedure to Print Report
ZHENG Xiao-hong
(From the Computer Science Department of Beijing Dongcheng Audlt College, Beijing 100020, China)
Abstract: This article will introduce, using the Visual Basic operation Microsost Excel in a application writen Visual Basic, how to print the dissimilar structure and diferen title reports with a procedure that takes a recordset parameter and a string type parameter. The procedure overcame the limit of function of the Visual Basic report design; solved the problem to print the different structure recordsets which were produce in a routine; unified and simplified the methos to design and print reports to each kind of different structure in a application writen Visual Basic.
Key words: Visual Basic; Excel; Print Report
1 Visual Basic系統中報表功能的局現限
盡管Visual Basic系統中提供了設計打印報表功能,但是,需要對各種結構不同的數據表分別去設計,這是一項繁瑣的工作,并且要在程序設計階段確定數據表的結構。然而,在信息管理系統中,常常需要程序運行中,根據用戶輸入條件而生成各種結構不同的記錄集,對于這種程序運行中生成的記錄集,在程序設計時往往不能確定表的結構,要打印輸出這種動態表,Visual Basic中的報表設計功能是無能為力的。
2 Visual Basic數據表通用打印程序
本人在信息管理系統開發應用中,利用VB操作Excel,設計一個帶參數的過程,實現對各種結構不同的數據表的打印輸出,使得對各類不同結構數據表的設計及打印統一并簡化為對通用打印過程的一次調用,大大提高了VB程序設計中報表設計和打印的效率。
2.1 通用報表打印過程的參數
在標準模塊中聲明Public報表打印過程,過程的頭如下面語句所示:
Public Sub TablePrint(rs As ADODB.Recordset, Title As String)
其中TablePrint為過程名,參數rs是ADO記錄集對象,參數Title是字符串變量,這兩個參數分別將要打印報表對應的記錄集和報表標題帶入到打印過程,在打印過程中從這兩個參變量中獲取并輸出要打印報表的標題、結構及數據。
2.2 在Visual Basic中引用和創建外部Excel對象
在VB中操作Excel,首先要添加引用“Microsof Excel Object Library”。在設置引用Excel對象之后,在過程中聲明Excel應用程序對象、工作簿對象并創建相關對象實例。下面語句依次聲明了Excel應用程序對象xlapp、工作簿對象xlbook。
Dim xlapp As Excel.Application
Dim xlbook As Excel.Workbook
下面語句依次創建Excel應用程序對象實例、新工作簿文件實例及選擇工作表sheet1。
Set xlapp = CreateObject(\"excel.application\")
Set xlbook = xlapp.Workbooks.Add
xlapp.Sheets(1).Select
2.3 由記錄集的字段名建立表的列標題
將記錄集輸出為數據表,首先要建立數據表的列標題,本程序通過一個循環語句將記錄集的字段名即表的列標題依次寫入當前選定的工作表Sheet1的第1行。
For i = 0 Tors.FieldsCount-1
xlapp.Cells(1, i+1) = rs.Fields(i).Name
Next i
2.4 將記錄集中的數據寫入工作表
下面語句通過一個嵌套的循環將記錄集中的記錄數據依次寫入工作表。
rs.MoveFirst
For j = 1 To rs.RecordCount
For i = 0 To rs.Fields.Count-1
xlapp.Cells(j+1, i+1) = rs.Fields(i).Value
Next i
rs.MoveNext
Next j
2.5 記錄工作表的數據區域
為了使程序能自動將數據表完整打印,程序必須記錄Excel工作表中的數據區域,下面語句分別獲取表格數據區域的最右列列號及右下角單元格地址,存入變量ec及ec1中。
ec = Chr(65 + rs.Fields.Count -1)
ecl = ec rs.RecordCount + 1
2.6 設置數據表的列寬及文字格式
在打印數據表之前,需要設置工作表的格式。
Excel工作表中的“Columns”對象的“AutoFit”方法,可實現工作表自動調整列寬為最適合的列寬。
xlapp.Worksheets(1).Columns(\"A:\" ec).AutoFit
在選定工作表的數據區后,利用Excel工作表的相關屬性設置選定區域的字體、字號及文字對齊方式。
xlapp.Range(\"a1\", ecl).Select
With xlapp.Selection
.Font.Name = \"宋體\"
.Font.Size = 10
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
2.7 設置數據表的打印格式及打印輸出
在打印數據表之前,打印格式的設置是必不可少的。用With xlapp.ActiveSheet.PageSetup……End With括起來的下面一組語句實現了對數據表的打印設置。
設置打印區域、頁眉中打印數據表標題和打印日期、頁腳中打印頁碼和頁數
.PrintArea = \"a1:\" ecl
.CenterHeader = Title \" (打印日期:\"\"Times New Roman,常規\"\"D\"\"宋體,常規\"\")\"
.CenterFooter = \"第 P 頁,共 N 頁\"
設置打印數據表的上、下、左、右、頁邊距及頁頭、頁腳邊距
.TopMargin = Application.InchesToPoints(1)
.BottomMargin = Application.InchesToPoints(1)
.LeftMargin = Application.InchesToPoints(0.5)
.RightMargin = Application.InchesToPoints(0.2)
.HeaderMargin = Application.InchesToPoints(0.5)
.FooterMargin = Application.InchesToPoints(0.5)
設置打印表格線、設置每頁都要打印的列標題、設置表的打印縮放比例。
.PrintGridlines = True
.PrintTitleRows = \"$1:$1\"
.Zoom = 95
下面語句實現將工作表打印,并且首先彈出打印預覽頁面,由用護選擇時否打印。
xlapp.ActiveWindow.SelectedSheets.PrintOut Preview:=True
2.8 完整的打印過程源代碼
Public Sub TablePrint(rs As ADODB.Recordset, Title As String)
'定義Excel應用程序對象xlapp、工作簿對象xlbook
Dim xlapp As Excel.Application
Dim xlbook As Excel.Workbook
Set xlapp = CreateObject(\"excel.application\") '創建Excel應用程序對象實例
Set xlbook = xlapp.Workbooks.Add '創建新工作簿文件
xlapp.Sheets(1).Select '選擇工作表sheet1
xlapp.Visible = 1 '設置電子表格的可見性為假(調試時可設置為真,以便于觀察)
'將記錄集的字段(表的列標題)寫入Sheet1表的第1行
For i = 0 To rs.Fields.Count - 1
xlapp.Cells(1, i + 1) = rs.Fields(i).Name
Next i
'將記錄集中的記錄寫入Sheet1中
rs.MoveFirst
For j = 1 To rs.RecordCount
For i = 0 To rs.Fields.Count - 1
xlapp.Cells(j + 1, i + 1) = rs.Fields(i).Value
Next i
rs.MoveNext
Next j
'獲取表格有效區域——即有數據的區域
ec = Chr(65 + rs.Fields.Count - 1)'最右邊列號
ecl = ec rs.RecordCount + 1 '最右下角單元格地址
'自動調整表格列寬
xlapp.Worksheets(1).Columns(\"A:\" ec).AutoFit
'設置表格字體,字號,單元格文字對齊
xlapp.Range(\"a1\", ecl).Select
With xlapp.Selection
.Font.Name = \"宋體\"
.Font.Size = 10
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
End With
'打印設置
With xlapp.ActiveSheet.PageSetup
'設置頁眉:顯進標題和打印日期
.CenterHeader = Title \"(打印日期:\"\"Times New Roman,常規\"\"D\"\"宋體,常規\"\")\"
'設置頁腳
.CenterFooter = \"第 P 頁,共 N 頁\"
'設置上、下、左、右、頁邊距及頁頭、頁腳邊距
.LeftMargin = Application.InchesToPoints(0.5)
.RightMargin = Application.InchesToPoints(0.2)
.TopMargin = Application.InchesToPoints(1)
.BottomMargin = Application.InchesToPoints(1)
.HeaderMargin = Application.InchesToPoints(0.5)
.FooterMargin = Application.InchesToPoints(0.5)
.PrintHeadings = False '設置打印表的行列號
.PrintArea = \"a1:\" ecl'設置打印區域
.PrintGridlines = True '設置打印表格線
.PrintTitleRows = \"$1:$1\" '設置行標題
.PrintTitleColumns = \"$A:$B\" '設置頁標題
.CenterHorizontally = True '設置表格打印水平距中
.Zoom = 95'設置表格打印的縮放比例(也可做為參數代入)
End With
'打印預覽并打印
xlapp.ActiveWindow.SelectedSheets.PrintOut Preview:=True
End Sub
3 結束語
在Visual Basic應用程序中,調用該過程,就可實現Visual Basic操作Excel程序在后臺設計及打印數據表,用戶看不到具體過程,只看到漂亮的報表輕易地被打印出來。
這種方法可以充分發揮MS Excel的報表設計打印功能,簡化了Visual Basic應用程序中的報表設計工作,擺脫了Visual Basic中設計打印數據報表的煩腦。
參考文獻:
[1] 劉文濤. Visual Basic+Access數據庫開發與實例[M]. 清華大學出版社,2006-07.
[2] 劉韜. Visual Basic 實效編程百例[M]. 人民郵電出版社,2004-08.
[3] 吳剛. 實現VB與EXCEL的無縫連接[M]. http://www.yesky.com/20030217/1652372.shtml,2003-02.