视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
基于VB_PRINTER对象的动态报表打印
2025-09-25 17:39:18 责编:小OO
文档
利用VB 本身自带的数据库报表难以实现动态打印,经过对MSHFlexGrid 控件、

Printer 对象的深入研究,遵循WINDOWS “所见即所得”的思想,编写程序,实现了既能显示查询数据,又能按MSHFlexGrid 控件中内容的实际大小进行快捷输出。

1控件与打印技术简介

1.1MSHFlexGrid 控件

Microsoft Hierarchical FlexGrid (MSHFlexGrid )控件提供了类似EXCEL 电子表格的功能,控件可对表格中数据进行显示和操作,并且在对包含字符串和图片的表格进行分类合并及格式化时,具有很强的灵活性。

此控件中的Cols 和Rows 属性决定了MSHFlexGrid 控件中的列数和行数,Row 和Col 属性指定了当前单元格,使用鼠标或者方向键可改变单元格的位置,

TextMatrix (i,j )属性为显示网格中i 行j 列位置的文本内容,可进行读写赋值,表中单元格的列宽、行高分别由ColWidth 和RowHeight 属性进行设定。1.2

打印技术

VB 提供了三种打印正文和图形的技术:

(1)在窗体中建立所需要的输出,然后调用PrintForm 方法打印窗体。

(2)先设置Printers 集合中的缺省打印机,再传送正文和图形到打印机。

(3)先传送正文和图形给Printer 对象,再进行打印输出。

因为Printer 对象是一个与设备无关的图片空间,支持用Print 、PSet 、Line 、PaintPicture 和Circle 方法来创建文本和图形,并将文本和图形与打印机的分辨率、功能进行了最佳的匹配。

采用Printer 对象打印输出,主要需设置CurrentX 和CurrentY 属性,这两个属性决定Printer 对象当前页中的输

出位置。

2实现思想

假设需打印的内容通过查询已显示在MSHFlexGrid 控件中如表1。

由于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 '存放每页开始的行、列序号

收稿日期:2008-07-30

*叶建良绍兴县职业教育中心中学一级教师(浙江,绍兴312030)。

·98

·

表1

2009年4月

第2期

电脑学习

要:介绍在VB 中引用MSHFlexGrid 控件、Printer 对象,将显示在MSHFlexGrid 控件中的动态报表打印输出的设计思想与

关中图分类号:TP311文献标识码:A 文章编号:1002-2422(2009)02-0098-02

Dynamic Report Printing Based on Printer Object in VB

Ye Jianliang

Abstract :The paper presents the programming ideas and source code which could in MSHFlexGrid display dynamic report pr-

Keyword:键词:程序源码。

基于VB-PRINTER 对象的动态报表打印

inting control by quoting MSHFlexGrid control,printer object in VB.

叶建良*

动态报表打印MSHFlexGrid 控件Printer 对象Dynamic Report

Print MSHFlexGrid Control Printer Object

Dim i,j,n,L As Integer

With MSHFlexGrid1

'确定每页行开始、结束位置,行方向需要的页数

PageRow=0:L=.RowHeight(0):row(PageRow)=1

For i=1To.Rows-1

L=L+.RowHeight(i)

If L>14000Then

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=1To.Cols-1

L=L+.ColWidth(j)

If L>10500Then

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=1To PageRow

For j=1To PageCol

'调用打印一页过程,参数为开始行、列,结束行、列

Print_Grid2row(i-1),row(i)-1,Col(j-1),Col(j)-1

If PageRow+PageCol>2Then'若页数大于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

'注:因为打印是以缇为单位的,1厘米=567缇,A4纸大小为21厘米(宽)×29.7厘米(高),所以转换为缇为单位的大小是11907缇×16839.9缇,故打印中横向、纵向不应超过这二个数,上面程序设定横向不超过10500缇,纵向不超过14000缇,用变量L表示3.2打印单页过程

Private Sub Print_Grid2(ByVal StartRow As Integer,ByVal EndRow As Integer,_ByVal StartCol As Integer,ByVal EndCol As Integer)

Dim Px,Py,x1,y1,i,j As Integer

Dim L As Long,W As Long x1=1000:y1=1000

Px=100:Py=50

With MSHFlexGrid1

'打印第一行

Printer.CurrentX=x1+Px

Printer.CurrentY=y1+Py

Printer.Print.TextMatrix(0,0)

W=.ColWidth(0)

For j=StartCol To EndCol

Printer.CurrentX=x1+W+Px

Printer.CurrentY=y1+Py

Printer.Print.TextMatrix(0,j)

W=W+.ColWidth(j)

Next j

L=.RowHeight(0)

Printer.Line(x1,y1)-(x1+W,y1)

Printer.Line(x1,y1+L)-(x1+W,y1+L)

'各行数据,表格线

For i=StartRow To EndRow

Printer.CurrentX=x1+Px'第一列

Printer.CurrentY=y1+L+Py

Printer.Print.TextMatrix(i,0)

W=.ColWidth(0)

For j=StartCol To EndCol

Printer.CurrentX=x1+W+Px

Printer.CurrentY=y1+L+Py

Printer.Print.TextMatrix(i,j)

W=W+.ColWidth(j)

Next j

L=L+.RowHeight(i)

Printer.Line(x1,L+y1)-(x1+W,L+y1)

Next i

'竖线打印

Printer.Line(x1,y1)-(x1,L+y1)

W=0

W=W+.ColWidth(0)

Printer.Line(x1+W,y1)-(x1+W,L+y1)

For j=StartCol To EndCol

W=W+.ColWidth(j)

Printer.Line(x1+W,y1)-(x1+W,L+y1)

Next j

End With

End Sub

4结束语

利用MSHFlexGrid控件与Printer对象的配合,采用两个过程,实现动态报表的显示与打印,解决了其它方法在VB上难以实现的动态报表输出问题。

参考文献

[1]E Winemiller,J Roff、B Heyman著.Visual Basic6.0数据库开

发.顾斌,杨德斌,译.北京:清华大学出版社,2002.

[2]王道义,等编著.Visual Basic6使用详解.北京:机械工业出

版社,1999.

·99·下载本文

显示全文
专题