基于VB-PRINTER对象的动态报表打印[图](2)
由于MSHFlexGrid行列值(ColWidth、RowHeight )与Printer对象在输出时默认行列值单位一致的,所以报表输出只要结合A4纸的尺寸大小,统计出在MSHFlexGrid控件中的内容所需页数、每页的行、列位置,然后调用打印过程。
窗体打印过程Print_Grid1:根据MSHFlexGrid控件中行高、列宽及行列数,计算出每页开始与结束的行、列位置及行、列方向所需的页数,总的页数为行列方向页数相乘的积,然后以求得的每页开始与结束的行、列位置为参数调用打印过程Print_Grid2。
过程Print_Grid2:为单页打印,利用Printer对象,通过Print_Grid1的多次调用本过程,可将MSHFlexGrid控件上的数据逐页全部打印输出。
3 程序代码
3.1 全部页码打印程序
Private Sub Print_Grid1()
Dim row(50), Col(50) As Integer '存放每页开始的行、列序号
Dim PageRow, PageCol As Integer '行、列方向所需的页数
Dim i, j, n, L As Integer
With MSHFlexGrid1
'确定每页行开始、结束位置,行方向需要的页数
PageRow = 0: L = .RowHeight(0): row(PageRow) = 1
For i = 1 To .Rows - 1
L = L + .RowHeight(i)
If L > 14000 Then
PageRow = PageRow + 1
row(PageRow) = i
L = .RowHeight(i) + .RowHeight(0)
End If
Next i
PageRow = PageRow + 1: row(PageRow) = .Rows
'确定每页列开始、结束位置,列方向需要的页数
PageCol = 0: L = .ColWidth(0): Col(PageCol) = 1
For j = 1 To .Cols - 1
L = L + .ColWidth(j)
If L > 10500 Then
PageCol = PageCol + 1
Col(PageCol) = j
L = .ColWidth(j) + .ColWidth(0)
End If
Next j
PageCol = PageCol + 1: Col(PageCol) = .Cols
'按先行后列打印,总页数为PageRow×PageCol
n = 0
For i = 1 To PageRow
For j = 1 To PageCol
'调用打印一页过程,参数为开始行、列,结束行、列
Print_Grid2 row(i - 1), row(i) - 1, Col(j - 1), Col(j) - 1
If PageRow + PageCol > 2 Then '若页数大于2,右下角打印页码
n = n + 1
Printer.CurrentX = 10000: Printer.CurrentY = 15500
Printer.Print "第 " & n & " 页"
End If
Printer.NewPage
Next j
Next i
End With
Printer.EndDoc
End Sub