VB利用DataReport做报表详解
- 格式:doc
- 大小:165.50 KB
- 文档页数:46
巧用 VB6 之 Data Report 实现图片(Picture)、图表(MsChart)的打印及预览VB 6.0 专业版和企业版中的数据报表设计器(Data Report Designer) 是用来实现打印数据库数据的有力工具。
在通常状况下, DataReport 的数据源(DataSource)应该是由数据库(DataBase)的基本表(Table)、视图(View)或查询(Query)等生成的,更确切的说该数据源应是一个ADODB.Recordset (二维表),而且ADO 允许生成并打开任意无数据库实体的记录集。
这样就可以为DataReport 随便设置一个数据源,用其实现实现图片打印的预览。
首先,新建"标准Exe"工程,再为工程添加"Data Report" 。
设置"工程属性"的启动对象为"DataReport"。
先使DataReport "显示报表标头/注脚"(右鼠键快捷菜单),再绘制一个RptImage 控件到"报表标头"区域。
然后,就可以编写程序代码了:Private DataReport_Initialize()'创建并打开一个任意的记录集,并将其设置为 DataReport 的数据源Dim adoRecordset As New ADODB.RecordsetadoRecordset.Fields.Append "X", adVariantadoRecordset.OpenSet Me.DataSource = adoRecordsetConst ErrorX = 400 '打印机横向误差Const ErrorY = 400 '打印机纵向误差Me.ReportWidth = Printer.Width - Me.LeftMargin - Me.RightMargin - ErrorXMe.Sections.Item("Section1").Height = 0Me.Sections.Item("Section3").Height = 0Me.Sections.Item("Section2").Controls.Item("Image1").PictureAlign ment = rptPACenterMe.Sections.Item("Section2").Controls.Item("Image1").SizeMode = rptSizeClipMe.Sections.Item("Section2").Controls.Item("Image1").Left = 0Me.Sections.Item("Section2").Controls.Item("Image1").Top = 0Me.Sections.Item("Section2").Height = Printer.Height - Me.TopMargin - Me.BottomMargin - ErrorYMe.Sections.Item("Section2").Controls.Item("Image1").Width= Me.ReportWidthMe.Sections.Item("Section2").Controls.Item("Image1").Height = Me.Sections.Item("Section2").HeightDim x As PictureSelect Case iCase 1 '打印 MsChart。
VB利用DataReport做报表首先介绍一下DataReport对象的几个常用属性。
一是DataSource,用于设置一个数据源,通过该数据源,数据使用者被绑定到一个数据库;二是DataMember,从DataSource提供的几个数据成员中设置一个特定的数据成员;三是LeftMargin、RightMargin、TopMargin、BottomMargin等,用于指定报表的左右上下的页边距;四是Sections,即DataReport的报表标头、页标头、细节、页脚注、报表脚注5个区域,如果加上分组(可以有多层分组),则增加一对区域,即分组标头、分组脚注。
其中DataSource一般是一个数据环境或是ADODB.Connection类型的变量,而DataMember则对应数据环境中的Command或是ADODB.RecordSet类型的变量,推荐使用数据环境及Command,页边界大家肯定都很清楚,下面我主要介绍以下Sections,这也是DataReport的精髓所在。
Sections是一个集合,您可以为每一个Section指定名称,也可以用其缺省的索引,从上到下依次为1、2…。
每个Section均有Height和Visible属性,您可以在一定条件下使一个Section不可见。
在Section中可以放置各种报表控件,其中RptLabel、RptImage、RptShape 和RptLine可以放在任意的Section中,用于输出各种文字、图形及表格线;RptTextBox只能放在细节中,一般用于绑定输出DataMemeber提供的数据字段;RptFunction只能被放置在分组注脚中,用于输出使用各种内置函数计算出的合计、最大值、最小值、平均值、记数等等。
上述报表控件中常用公共属性有用于控制位置及高度宽度的Top、Left、Height、Width和控制可见性的Visible;其中RptTextBox还有DataField、DataMember、DataFormat及Font属性;其他属性不再多说。
Vb6.0中DATAREPORT的使用Vb 6.0 中DATAREPORT 的使用一、打开VB6.0新建一“标准EXE”工程二、在“工程”菜单上,单击“添加DATA ENVIROMENT”向工程中一个设计器,此处为添加DATA ENVIROMENT1数据环境。
三、在弹出的工程1窗口中右键点击“CONNECTION1”,在弹出菜单中选择“属性”弹出数据链接属性窗体,在“提供程序”中选择自己的数据库环境。
如MICROSOFT OLE DB PROVIDER FOR SQL SERVER,点选下一步,选择自己的服务器、用户和密码,数据库等。
四、右键单击“CONNECTION1”,在弹出的菜单中选择“添加命令”,添加一个命令为COMMNAD1,右键单击“COMMNAD1”,在弹出菜单选择属性,在属性窗口的“通用”中对命令进行命名和连接的设置。
对数据源进行表的选择,“数据库对象”选择“表”,“对象名称”中选择你数据库中的表。
点击确定完成。
五、右键单击“COMMNAD1”,在弹出菜单中选择“添加子命令”,添加子命令为COMMAND2,右键单击“COMMNAD2”,在弹出菜单选择属性,在属性窗口的“通用”中对命令进行命名和连接的设置。
对数据源进行表的选择,“数据库对象”选择“表”,“对象名称”中选择你数据库中的表,再在“关联”项中对COMMAND1与COMMAND2的关联项进行设置,也就是此两表都有的关联字段,点“添加”进行添加。
最后点击确定完成。
六、创建数据报表DATAREPORT。
在“工程”菜单上,单击“添加DATA REPORT”向工程中一个数据报表DATAREPORT1。
在DATAREPORT1的属性窗口中,更改其DATASOURCE 为DATAENVIRONMENT1,DATAMEMBER 为COMMAND1。
七、右键单击数据报表设计器窗体,在弹出菜单上单击“检索结构”。
八、从数据环境设计器DATA ENVIROMENT1中拖动COMMAND1中几个需要的字段到DATA REPORT的“分组标头”中。
Vb 6.0 中DATAREPORT 的使用一、打开VB6.0新建一“标准EXE”工程二、在“工程”菜单上,单击“添加DATA ENVIROMENT”向工程中一个设计器,此处为添加DATA ENVIROMENT1数据环境。
三、在弹出的工程1窗口中右键点击“CONNECTION1”,在弹出菜单中选择“属性”弹出数据链接属性窗体,在“提供程序”中选择自己的数据库环境。
如MICROSOFT OLE DB PROVIDER FOR SQL SERVER,点选下一步,选择自己的服务器、用户和密码,数据库等。
四、右键单击“CONNECTION1”,在弹出的菜单中选择“添加命令”,添加一个命令为COMMNAD1,右键单击“COMMNAD1”,在弹出菜单选择属性,在属性窗口的“通用”中对命令进行命名和连接的设置。
对数据源进行表的选择,“数据库对象”选择“表”,“对象名称”中选择你数据库中的表。
点击确定完成。
五、右键单击“COMMNAD1”,在弹出菜单中选择“添加子命令”,添加子命令为COMMAND2,右键单击“COMMNAD2”,在弹出菜单选择属性,在属性窗口的“通用”中对命令进行命名和连接的设置。
对数据源进行表的选择,“数据库对象”选择“表”,“对象名称”中选择你数据库中的表,再在“关联”项中对COMMAND1与COMMAND2的关联项进行设置,也就是此两表都有的关联字段,点“添加”进行添加。
最后点击确定完成。
六、创建数据报表DATAREPORT。
在“工程”菜单上,单击“添加DATA REPORT”向工程中一个数据报表DATAREPORT1。
在DATAREPORT1的属性窗口中,更改其DATASOURCE 为DATAENVIRONMENT1,DATAMEMBER 为COMMAND1。
七、右键单击数据报表设计器窗体,在弹出菜单上单击“检索结构”。
八、从数据环境设计器DATA ENVIROMENT1中拖动COMMAND1中几个需要的字段到DATA REPORT的“分组标头”中。
在VB中用数据报表设计器创建报表数据环境设计器(Data Environment designer)与数据报表设计器(Data Report designer)均是Visual Basic 6.0的新增功能,它们的出现大大增强了Visual Basic处理数据的能力。
在以往的Visual Basic版本中,制作报表都是通过第三方产品来完成并通过ActiveX控件输出的。
这两种设计器的出现,使得Visual Basic程序员再也不用考虑选择一个什么样的第三方工具设计报表了,所有的设计全部在Visual Basic内部完成,再加上Visual Basic 6.0新增的开发IIS应用程序和开发DHTML应用程序功能,使得Visual Basic 6.0是一个名副其实的装备齐全的集成开发环境了。
下面我们以一个比较简单的报表为例,详细阐述如何使用数据环境设计器和数据报表设计器来设计一个数据报表。
一、数据环境设计器与数据报表设计器数据环境设计器提供了一个交互式的设计环境。
通过设置Connection对象和Command 对象的属性,可以快速完成到一个数据源的连接。
对于设置好的数据环境设计器,可以将它的对象拖放到表单上或是报表上,它会自动创建并完成数据绑定控件的设置。
数据报表设计器是一个极为灵活的设计报表的工具。
它以数据环境设计器作为数据源,能创建有层次的、汇总若干个关系型数据表数据的复杂报表。
除了像传统的报表设计工具那样能将报表通过打印机输出以外,数据报表设计器还能以HTML或文本文件的格式输出报表。
二、数据环境对象数据环境设计器包含以下几个对象:1. 数据连接(Connection)对象:连接对象表示到一个作为数据源的远端数据库或本地数据库的连接。
在数据环境中必须至少包含一个连接对象,要使用数据环境存取数据,必须首先创建连接对象。
2. 数据命令(Command)对象:命令对象定义了从数据库连接中将取回什么数据的详细信息。
VB利用Dat aRepor t做报表首先介绍一下D a taRep ort对象的几个常用属性。
一是DataS ource,用于设置一个数据源,通过该数据源,数据使用者被绑定到一个数据库;二是DataM ember,从DataSo urce提供的几个数据成员中设置一个特定的数据成员;三是LeftM argin、RightMa rgin、TopMarg in、Bottom M a rgin等,用于指定报表的左右上下的页边距;四是Secti ons,即DataRe port的报表标头、页标头、细节、页脚注、报表脚注5个区域,如果加上分组(可以有多层分组),则增加一对区域,即分组标头、分组脚注。
其中DataSo urce一般是一个数据环境或是ADO DB.Connect ion类型的变量,而DataMe mber则对应数据环境中的Comm and或是A D ODB.RecordS et类型的变量,推荐使用数据环境及Command,页边界大家肯定都很清楚,下面我主要介绍以下Sect ions,这也是Data Report的精髓所在。
Sections是一个集合,您可以为每一个S ectio n指定名称,也可以用其缺省的索引,从上到下依次为1、2…。
每个Secti on均有He ight和V i sible属性,您可以在一定条件下使一个S e ction不可见。
在Sectio n中可以放置各种报表控件,其中RptLa bel、RptImag e、RptSha p e和RptL ine可以放在任意的Sect ion中,用于输出各种文字、图形及表格线;R ptText Box只能放在细节中,一般用于绑定输出Data Memebe r提供的数据字段;RptFunc tion只能被放置在分组注脚中,用于输出使用各种内置函数计算出的合计、最大值、最小值、平均值、记数等等。
第六节报表设计对一个完整的数据库应用程序来说,制作并打印报表是不可缺少的环节。
VB 6.0 提供了DataReport 对象作为数据报表设计器(DamReport designer),DataReport对象除了具有强大的功能外,还提供了简单易操作的界面。
DataReport对象可以从任何数据源包括数据环境创建报表,数据报表设计器可以联机查看、打印格式化报表或将其导出到正文或HTML页中。
一、报表设计器数据报表设计器由DataReport对象、Section对象和DataReport控件组成。
1.DataReport对象DataReport对象与VB的窗体相似,同时具有一个可视的设计器和一个代码模块,可以使用设计器创建报表的布局,也可以在代码模块中添加代码。
在“工程”菜单上,单击“添加DataReport”命令,将数据报表设计器添加到工程中,则出现如图5-6-1所示的DataReport1对象,由“报表标头”、“页标头”、“细节”、“页注脚”和“报表注脚”组成。
图5-6-1·报表标头:指显示在一个报表开始处的文本,例如用来显示报表标题、作者或数据库名。
·页标头:指在每一页顶部出现的信息,例如用来显示每页的报表标题。
·分组标头、注脚:指数据报表中的“重复”部分。
每一个分组标头与一个分组注脚相匹配,用于分组。
·细节:指报表的最内部的“重复”部分(记录),与数据环境中最低层的Command 子对象相关联。
·页注脚:指在每一页底部出现的信息,例如,用来显示页码。
·报表注脚:指报表结束处出现的文本,例如,用来显示摘要信息或一个地址或联系人姓名。
报表注脚出现在最后一个页注脚之前。
2.Section对象数据报表设计器的每一个部分由Section对象表示,如图5-6-1中的Section1~Section5。
设计时,每一个Section由一个窗格表示,可以单击窗格以选择页标头,编程改变其外观和行为,也可以在窗格中放置和定位控件,对Section对象及其属性进行动态重新配置,更改每一个Section对象的布局来设计报表。
VB通用数据表格输出程序的设计做为一种简捷、系统的Windows应用程序开发工具,Visual Basic具有强大的数据处理能力,提供了多种数据访问方法,可以方便地存取Microsoft SQL Server、Oracle、XBase等多种数据库,被广泛应用于建立各种信息管理系统。
但是,VB缺乏足够的、符合中文习惯的数据表格输出功能。
虽然使用Crystal Report控件及Crystal Reports程序可以输出报表,但操作很麻烦,中文处理能力也不理想,特别是不能够用来制作不确定内容的表格。
笔者在用VB开发淮北市医疗保险信息管理系统时,需要对任意的查询结果进展表格输出,为此,编制了一个通用的数据表格输出控件,能够根据查询的结果自动生成二维中文表格,并打印输出,在此介绍给大家,共同探讨。
一.VB中的结果集VB提供的数据访问方法有数据询问对象(DAO)、Data控件、远程数据对象(RDO)、RemoteData控件(RDC)、ODBC API、VB SQL等,其中ODBC API比拟复杂,开发、调试和支持非常困难;VB SQL是针对Microsoft SQL Server的,这两种方法使用的比拟少,这里不做讨论。
比拟常用的方法是DAO、Data控件、RDO、RDC,其中DAO和Data控件使用的结果集(又叫纪录集) 包含在Recordset 对象中,RDO和RDC使用的结果集包含在rdoResultset对象中。
通用表格输出的实现方法就是根据任意的Recordset对象或rdoResultset对象自动生成表格并输出。
二.表格的自动生成1. Recordset对象下面以Data控件为例,介绍Recordset对象的表格自动生成方法。
假设有Data控件名称为MyData,首先说明相关的内容及用法:(1) Data控件的结果集包含在它的Recordset对象中,引用方法为: MyData.Recordset。
Visual Basic6.0下数据库报表制作技巧在运用Visual Basic编制MIS系统前台程序时,往往会需要处理大量的报表。
而这些报表的制作,在Visual Basic6.0出现之前,要么需要使用Print语句编写大量程序代码,要么选择诸如Seagate等第三方公司所提供的诸如Data Report等软件,而一旦真正使用这些没有本地化的软件或控件,程序员往往会遇到各种各样令人头疼不已的问题——或者是中文字体显示有所限制,或者是报表数据无法动态及时更新,或者所提供的数据处理或统计功能并不怎么适用。
所幸的是,MicroSoft推出的Visual Basic6.0专业版和企业版中包含一个全新的组件——Data Report Designer (DRD),运用这个报表设计器,我们可以将报表与数据环境对象或者是ActiveX数据对象直接关联,使得Visual Basic6.0下的报表设计效率得到空前提高。
下面,就本人在运用DRD进行报表程序设计所获得的心得与大家共同探讨一下。
一将DRD与DED(Data Enviroment Designer)结合。
这是运用DRD解决Visual Basic6.0报表处理最常用的一种方法,在Samples中有一个名为Prjnwind工程就是专门介绍如何使用结合使用DRD和DED的例子程序。
我们可以通过选择新工程中的Data Project类型就可以自动增加一个空的DED和DRD实例到Project explorer中,打开一个空DataReport实例将禁止工具栏中的General 窗体并在工具栏底添加一个DataReort按钮。
如下图:可以看到,DataReport的专用控件——RptLabel、RptTextBox、RptImage、RptLine、RptShape和RptFunction。
除了RptFunction,每个Rpt控件都可以在固有Visual Basic工具面板中找到对应的控件。
首先介绍下DataReport对象几个常用属性是DataSource用于设置个数据源通过该数据源数据使用者被绑定到个数据库; 2是DataMember从DataSource提供几个数据成员中设置个特定数据成员;3是LeftMargin、RightMargin、TopMargin、BottomMargin等用于指定报表左右上下页边距; 4是Sections即DataaReport报表标头、页标头、细节、页脚注、报表脚注5个区域如果加上分组(可以有多层分组)则增加对区域即分组标头、分组脚注其中DataSource般是个数据环境或是ADODB.Connection类型变量而DataMember则对应数据环境中Command或是ADODB.RecordSet类型变量推荐使用数据环境及Command页边界大家肯定都很清楚下面我主要介绍以下Sections这也是DataReport精髓所在Sections是个集合您可以为每个Section指定名称也可以用其缺省索引从上到下依次为1、2…每个Section均有Height和Visible属性您可以在定条件下使个Section不可见在Section中可以放置各种报表Control控件其中RptLabel、RptImage、RptShape和RptLine可以放在任意Section中用于输出各种文字、图形及表格线;RptTextBox只能放在细节中般用于绑定输出DataMemeber提供数据字段;RptFunction只能被放置在分组注脚中,用于输出使用各种内置计算出合计、最大值、最小值、平均值、记数等等上述报表Control控件中常用公共属性有用于控制位置及高度宽度Top、Left、Height、Width和控制可见性Visible;其中RptTextBox还有DataField、DataMember、DataFormat及Font属性;其他属性不再多说然后介绍下我使用经验是对想控制报表Control控件按类型有规律命名; 2是用RptShape矩形框做表格线框比用RptLine画框省事多了只有斜线才使用RptLine; 3是报表标题及报表中表头文字、日期及页码用RptLabel其中Caption属性支持转义%D为长格式日期%d为短格式日期%P为总页数%p为当前页码(注意:D和d,P和p大小写的区别); 4是对固定报表在设计窗口直接将报表Control控件摆放到位对于活报表应首先考虑报表最大情形将足够Control控件分别放置在区别区域位置大小可以不必深究然后在报表输出前用VBA代码对所有Control控件属性进行调整包括位置、高度、宽度、字体、对齐方式、显示格式、可见性等等相应对Section也应根据情况调整其高度和可见性最后用个例子模板来介绍说明其使用思路方法连接数据库With 数据环境.rsCommand名If .State = adStateOpen Then .Close .Source = SQL语句.Open 打开想输出数据库数据项以便输出End WithWith 报表名.DataSource=数据环境.DataMember=Command名这两行也可固定设好而不必每次设置设置页表头部分(RpttLabel…为报表Control控件名).Sections(2).Controls("RptLabelPage").Caption = "共%P页第%p页".Sections(2).Controls("RptLabelDate").Caption = "打印日期:%D".Sections(3).Controls("RptLabel1").Left=……设置细节部分(RptShapeX、RptTextBoxX为报表Control控件名).Sections(3).Controls("RptShape1").Left=….Sections(3).Controls("RptShape1").Top=….Sections(3).Controls("RptShape1").Height=….Sections(3).Controls("RptShape1").Width=….Sections(3).Controls("RptTextBox1").DataMember=Command名.Sections(3).Controls("RptTextBox1").DataField=字段1.Section s(3).Controls("RptTextBox1")=…….Sections(3).Controls("RptShapeN").Visible=False.Sections(3).Controls("RptTextBoxN").Visible=False…. Sections(3).Height=计算出或固定细节高度动态调整报表标题(RptLabelTitle为报表标签Control控件名).Sections(2). Controls("Rpt LabelTitle").Left=…….Sections(2). Controls("RptLabelTitle").Alignment=……调整完毕后.Show 或 .PrReportEnd With这样做优点是报表设计时简单调整方便、随意只需更改点代码而不必为了点点修改而费神在设计窗口调整半天vb6.0 中,用"datareport" 报表控件制作报表,纸张定义 A4 A3 <上一篇 | 下一篇> '在vb6.0中,用"datareport" 报表控件制作报表,当使用报表预览功能时,"datareport"'报表控件将使用"windows系统的当前默认打印机"的打印设置,若该打印设置纸张尺寸(如A4纸)小于"datareport"'报表控件所需纸张尺寸(如A3纸),则"datareport" 报表预览时将会出现"打印纸张尺寸小于报表宽度"错误,'请教如何用代码设置"windows系统的当前默认打印机"的打印机纸张尺寸,而不需用"公共对话框"的打印设置方法?Option ExplicitPublic Enum PrinterOrientationConstantsOrientPortrait = 2OrientLandscape = 1End Enum'Printer.PaperSize = vbPRPSA3Private Type DEVMODEdmDeviceName As String * 32dmSpecVersion As IntegerdmDriverVersion As Integer dmSize As IntegerdmDriverExtra As IntegerdmFields As LongdmOrientation As IntegerdmPaperSize As IntegerdmPaperLength As IntegerdmPaperWidth As IntegerdmScale As IntegerdmCopies As IntegerdmDefaultSource As Integer dmPrintQuality As Integer dmColor As IntegerdmDuplex As IntegerdmYResolution As IntegerdmTTOption As IntegerdmCollate As IntegerdmFormName As String * 32 dmUnusedPadding As Integer dmBitsPerPel As IntegerdmPelsWidth As LongdmPelsHeight As LongdmDisplayFlags As LongdmDisplayFrequency As Long End TypePrivate Type PRINTER_DEFAULTSpDataType As StringpDevMode As LongDesiredAccess As LongEnd TypePrivate Type PRINTER_INFO_2pServerName As LongpPrinterName As LongpShareName As LongpPortName As LongpDriverName As LongpComment As LongpLocation As LongpDevMode As LongpSepFile As LongpPrintProcessor As LongpDataType As LongpParameters As LongpSecurityDescriptor As LongAttributes As LongPriority As LongDefaultPriority As LongStartTime As LongUntilTime As LongStatus As LongcJobs As LongAveragePPM As LongEnd TypePrivate Const DC_PAPERNAMES = 16Private Const DC_PAPERS = 2Private Const DC_PAPERSIZE = 3Private Const DM_IN_BUFFER = 8Private Const DM_OUT_BUFFER = 2Private Const DM_ORIENTATION = &H1Private Const DM_PAPERSIZE = &H2&Private Const DMPAPER_A3 = 8 ' A3 297 x 420 mmPrivate Const DMPAPER_A4 = 9 ' A4 210 x 297 mmPrivate Const PRINTER_ACCESS_ADMINISTER = &H4Private Const PRINTER_ACCESS_USE = &H8Private Const STANDARD_RIGHTS_REQUIRED = &HF0000Private Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _ PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _(hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)Private Declare Function OpenPrinter Lib "winspool.drv" Alias _"OpenPrinterA" (ByVal pPrinterName As String, phPrinter As _ Long, pDefault As Any) As LongPrivate Declare Function ClosePrinter Lib "winspool.drv" _(ByVal hPrinter As Long) As LongPrivate Declare Function DocumentProperties Lib "winspool.drv" _Alias "DocumentPropertiesA" (ByVal hWnd As Long, ByVal hPrinter As Long, _ByVal pDeviceName As String, pDevModeOutput As Any, pDevModeInput As Any, _ByVal fMode As Long) As LongPrivate Declare Function GetPrinter Lib "winspool.drv" _Alias "GetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _pPrinter As Any, ByVal cbBuf As Long, pcbNeeded As Long) As LongPrivate Declare Function SetPrinter Lib "winspool.drv" _Alias "SetPrinterA" (ByVal hPrinter As Long, ByVal Level As Long, _pPrinter As Any, ByVal Command As Long) As LongPrivate Declare Function DeviceCapabilities Lib "winspool.drv" _Alias "DeviceCapabilitiesA" (ByVal lpDeviceName As String, ByVal lpPort As String, _ByVal iIndex As Long, ByVal lpOutput As String, lpDevMode As DEVMODE) As LongFunction SetDefaultPrinterOrientation(ByVal eOrientation As _PrinterOrientationConstants, ByVal strPaperSize As String) As BooleanDim bDevMode() As ByteDim bPrinterInfo2() As ByteDim hPrinter As LongDim lResult As LongDim nSize As LongDim sPrnName As StringDim dm As DEVMODEDim pd As PRINTER_DEFAULTSDim pi2 As PRINTER_INFO_2' Get device name of default printersPrnName = Printer.DeviceName' PRINTER_ALL_ACCESS required under' NT, because we're going to call' SetPrinterpd.DesiredAccess = PRINTER_ALL_ACCESS' Get a handle to the printer.If OpenPrinter(sPrnName, hPrinter, pd) Then' Get number of bytes requires for' PRINTER_INFO_2 structureCall GetPrinter(hPrinter, 2&, 0&, 0&, nSize)' Create a buffer of the required si zeReDim bPrinterInfo2(1 To nSize) As Byte' Fill buffer with structurelResult = GetPrinter(hPrinter, 2, bPrinterInfo2(1), _nSize, nSize)' Copy fixed portion of structure' into VB Type variableCall CopyMemory(pi2, bPrinterInfo2(1), Len(pi2))' Get number of bytes requires for' DEVMODE structurenSize = DocumentProperties(0&, hPrinter, sPrnName, _ 0&, 0&, 0)' Create a buffer of the required si zeReDim bDevMode(1 To nSize)' If PRINTER_INFO_2 points to a DEVMOD E' structure, copy it into our bufferIf pi2.pDevMode ThenCall CopyMemory(bDevMode(1), ByVal pi2.pDevMode, Len(dm))Else' Otherwise, call DocumentProperties ' to get a DEVMODE structureCall DocumentProperties(0&, hPrinter, sPrnName, _bDevMode(1), 0&, DM_OUT_BUFFER)End If' Copy fixed portion of structure' into VB Type variableCall CopyMemory(dm, bDevMode(1), Len(dm))With dm' Set new orientationSelect Case strPaperSizeCase "A3".dmPaperSize = DMPAPER_A3 Case "A4".dmPaperSize = DMPAPER_A4 End Select.dmOrientation = eOrientation.dmFields = DM_ORIENTATION + DM_PAPERSIZE End With' Copy our Type back into bufferCall CopyMemory(bDevMode(1), dm, Len(dm))' Set new orientationCall DocumentProperties(0&, hPrinter, sPrnName, _ bDevMode(1), bDevMode(1), DM_IN_BUFFER Or _ DM_OUT_BUFFER)' Point PRINTER_INFO_2 at our' modified DEVMODEpi2.pDevMode = VarPtr(bDevMode(1))' Set new orientation system-widelResult = SetPrinter(hPrinter, 2, pi2, 0&)' Clean up and exitCall ClosePrinter(hPrinter)SetDefaultPrinterOrientation = TrueElseSetDefaultPrinterOrientation = FalseEnd IfEnd Function''''----------------------------------''''---njx:窗体调用的代码:打印纸选用:1:纵向 2.横向'''SetDefaultPrinterOrientation 2, "A3"''''-----------------------------------1.报表的概念利用报表可以把数据表中的数据按一定的格式输出到屏幕上或打印到纸上。