会员登录 - 用户注册 - 网站地图 Office中国(office-cn.net),专业Office论坛
当前位置:主页 > 技巧 > Access技巧 > 报表打印 > 正文

创建完美报表

时间:2003-12-06 23:52 来源:计算机世界网 作者:胡春林 阅读:
Access作为Microsoft Office办公软件包中的一部分,以其友好的操作界面和卓越的数据管理能力而日益成为中小型管理信息系统的理想开发环境,在各行各业得到了广泛的应用。但在应用中我们发现,Access在报表输出上还存在一些不足:尽管它可以很好地处理一些基于页面的报表,但对一些复杂报表或一些特殊报表的处理能力却很难令人满意,这主要是由于Access系统附带的报表设计器太过直观,缺少了程序设计和文字处理所需的必要的灵活性。而Word作为Microsoft Office家族中的重要成员——字处理器,其强大的文字处理功能正好可以弥补Access在报表方面的不足。这就使得我们自然而然地想到将Access与Word有机地结合起来,利用Access的数据处理功能进行数据的录入、查询、存储,而利用Word的字处理功能进行各种报表的打印输出。幸好,微软在设计Office的时候就已经为我们提供了一种在诸如access、Word、Excel等应用程序之间通信的机制,使得这种想法得以实现。 
一、基本原理 
对于一些复杂的或有特殊要求的查询,用ADO(ActiveX数据对象)来处理要比用Access本身提供的查询管理器更灵活一些。所以我们的基本思路是:用ADO执行一条或多条特定的SQL查询,生成我们所需要的一个或多个Recordset,再将这些Recordset中的数据逐条输出到Word文档,然后就可以用程序或手工控制Word文档的格式,达到我们的特殊要求。这听起来挺麻烦,可只要了解了其工作原理,实际操作却很简单。下面就分别以在access中和在Word中的具体操作为例进行介绍。 
二、在access中应用ADO将数据输出到Word 
1. 系统配置 
系统软件:Microsoft Windows 9x/NT/2000;Microsoft access 2000;Microsoft Word 2000。 
样例数据库:“C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb”,Office 2000中包含的例子。可将其中的“产品”表复制到一个新的数据库中,如“D:\db1.mdb”。 
窗 体:在数据库“D:\db1.mdb”中新建窗体“窗体1”,其中只包含1个命令按钮“命令0”。 
引用ADO:按Alt+F11进入Visual Basic编辑器,执行“工具”->“引用”命令,在弹出的引用窗体中选择“Microsoft ActiveX Data Objects 2.1”或更高版本。 
引用Word:再次执行命令“工具”->“引用”,在弹出的引用窗体中选择“Microsoft Word 9.0 Object Library”。 
2. 代码详解 
在“窗体1”的设计模式下右键单击“命令0”按钮,选择“事件生成器”,进入Visual Basic编辑器,创建过程“Private Sub 命令0_Click()”,其代码如下: 
Sub 命令0_Click() 
    '输入表格标题 
    Title = InputBox(vbCrLf & vbCrLf & "请输入表格标题:", "表格标题", "XX公司产品报价单") 
    If Title = "" Then Title = "XX公司产品报价单" 
 
    '步骤1:建立数据连接cnn 
    '由于数据库已经打开,所以直接应用CurrentProject.Connection就可以建立连接 
    Set cnn = New ADODB.Connection 
    Set cnn = CurrentProject.Connection 
 
    '步骤2:用SQL语句创建记录集rs 
    Set rs = New ADODB.Recordset 
    '设定游标类型与锁定类型 
    rs.CursorType = adOpenKeyset 
    rs.LockType = adLockOptimistic 
    '制定特定的查询条件,可以是任何有效的SQL查询,甚至包括多表、多条件等复杂的查询,查询条件也常常从窗体取得 
    SQL = "select 产品名称,单位数量,单价,库存量 from 产品 where 单价>10.00" 
    '创建记录集rs 
    rs.Open SQL, cnn 
    '统计字段数及记录数 
    total_fields = rs.Fields.Count 
    total_records = rs.RecordCount 
     
    '步骤3:建立Word文档对象 
    Set mywdapp = CreateObject("word.application") 
    '调整Word窗口大小 
    mywdapp.WindowState = wdWindowStateNormal 
    '生成新的Word文档实例 
    mywdapp.Documents.Add 
    '设置视图为页面视图 
    mywdapp.ActiveWindow.View.Type = wdPrintView 
    '转到Word视图,显示文档生成过程 
    mywdapp.Visible = True 
    mywdapp.Activate 
    '设置文档(表格)字体 
    mywdapp.ActiveDocument.Range.Font.Size = "9" 
 
    '步骤4:将记录集rs中的字段名称和字段内容输出到Word,各字段之间用制表符分隔 
    '输出字段名称 
    For I = 0 To total_fields - 2 
        mywdapp.Selection.TypeText Text:=rs.Fields(I).Name & vbTab 
    Next I 
    '最后一个字段名称后加回车符 
    mywdapp.Selection.TypeText Text:=rs.Fields(total_fields - 1).Name & vbCrLf 
    '逐条输出字段内容 
    Do While Not rs.EOF 
        For I = 0 To total_fields - 2 
        tmpstr = rs.Fields(I).Value 
        If rs.Fields(I).Name = "单价" Then 
            tmpstr = Format(tmpstr, "####.00") 
        End If 
        mywdapp.Selection.TypeText Text:=tmpstr & vbTab 
        Next I 
        '一条记录的最后一个字段后加回车符 
        mywdapp.Selection.TypeText Text:=rs.Fields(total_fields - 1).Value & vbCrLf 
        rs.MoveNext 
    Loop 
 
    '步骤5:关闭记录集 
    rs.Close 
    Set rs = Nothing 
 
    '步骤6:对Word中的数据进行格式化处理 
    '选定文本,将其转换为表格 
    '设置视图为普通视图 
    mywdapp.ActiveWindow.View.Type = wdNormalView 
    '将光标移动到文档末尾 
    mywdapp.Selection.EndKey Unit:=wdStory 
    '删除文档末尾多余的回车符 
    mywdapp.Selection.Delete Unit:=wdCharacter, Count:=1 
    '选中全部内容 
    mywdapp.Selection.WholeStory 
    '将所选内容转换为表格 
    mywdapp.Selection.ConvertToTable Separator:=wdSeparateByTabs, DefaultTableBehavior:=wdWord8TableBehavior 
    '将光标移动到文档开头 
    mywdapp.Selection.HomeKey Unit:=wdStory 
    '选定表格对象 
    Set Temp_Table = mywdapp.ActiveDocument.Tables(1) 
    '根据需要对表格进行处理,这是制作表格格式的关键,可反复调试 
    '本例只简单地设置了表格居中、自动调整表格列宽、表头居中、标题行重复、设置表格边框线、设置表格纵向居中 
    Temp_Table.Rows.Alignment = wdAlignRowCenter 
    Temp_Table.AutoFitBehavior wdAutoFitContent 
    Temp_Table.Rows(1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter 
    Temp_Table.Rows(1).Range.Rows.HeadingFormat = wdToggle 
    Temp_Table.Borders(wdBorderLeft).LineWidth = wdLineWidth150pt 
    Temp_Table.Borders(wdBorderRight).LineWidth = wdLineWidth150pt 
    Temp_Table.Borders(wdBorderTop).LineWidth = wdLineWidth150pt 
    Temp_Table.Borders(wdBorderBottom).LineWidth = wdLineWidth150pt 
    Temp_Table.Range.Cells.VerticalAlignment = wdCellAlignVerticalCenter 
    '将光标移动到文档开头 
    mywdapp.Selection.HomeKey Unit:=wdStory 
    '拆分表格 
    mywdapp.Selection.SplitTable 
    mywdapp.Selection.Font.Name = "黑体" 
    '插入标题 
    mywdapp.Selection.TypeText Text:=Title & vbCrLf 
    mywdapp.Application.ScreenRefresh '刷屏 
    '转到Acdess视图,显示结束对话框 
    mywdapp.Visible = False 
    Msg = "数据提取完毕。" & vbCrLf & vbCrLf 
    Msg = Msg & "总记录数=" & total_records & " 条" 
    MsgBox Msg, vbOKOnly, "数据提取完毕" 
    '转到Word视图,显示文档 
    mywdapp.Visible = True 
    mywdapp.Activate 
End Sub 


 
三、在Word中应用ADO直接提取access数据库中的数据 
1. 系统配置 
系统软件: Microsoft Windows 9x/NT/2000;Microsoft Word 2000。 
样例数据库:“C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb”,Office 2000中包含的例子。 
引用ADO:按Alt+F11进入Visual Basic编辑器,执行命令“工具”->“引用”,在弹出的引用窗体中选择“Microsoft ActiveX Data Objects 2.1”或更高版本。 
2. 代码详解 
进入Visual Basic编辑器,创建过程“Sub Word_ADO()”,其代码如下: 
 

Sub Word_ADO() 
    '输入表格标题 
    Title = InputBox(vbCrLf & vbCrLf & "请输入表格标题:", "表格标题", "XX公司产品报价单") 
    If Title = "" Then Title = "XX公司产品报价单" 
 
    '步骤1:建立数据连接cnn 
    '打开连接,示例数据库:C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb 
    Set cnn = New ADODB.Connection 
    cnn.Provider = "Microsoft.jet.oledb.4.0" 
    cnn.Open "C:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb" 
 
    '步骤2:用SQL语句创建记录集rs 
    Set rs = New ADODB.Recordset 
    rs.CursorType = adOpenKeyset 
    rs.LockType = adLockOptimistic 
    SQL = "select 产品名称,单位数量,单价,库存量 from 产品 where 单价>10.00" 
    rs.Open SQL, cnn 
    total_fields = rs.Fields.Count 
    total_records = rs.RecordCount 
    ActiveDocument.Range.Font.Size = "9" 
 
    '步骤3:将记录集rs中的字段名称和字段内容输出到Word文档,各字段之间用制表符分隔 
    For I = 0 To total_fields - 2 
        Selection.TypeText Text:=rs.Fields(I).Name & vbTab 
    Next I 
    Selection.TypeText Text:=rs.Fields(total_fields - 1).Name & vbCrLf 
    Do While Not rs.EOF 
        For I = 0 To total_fields - 2 
            tmpstr = rs.Fields(I).Value 
            If rs.Fields(I).Name = "单价" Then 
                tmpstr = Format(tmpstr, "####.00") 
            End If 
            Selection.TypeText Text:=tmpstr & vbTab 
        Next I 
        Selection.TypeText Text:=rs.Fields(total_fields - 1).Value & vbCrLf 
        rs.MoveNext 
    Loop 
 
    '步骤4:关闭记录集和连接 
    rs.Close 
    cnn.Close 
    Set rs = Nothing 
    Set cnn = Nothing 
 
    '步骤5:对Word中的数据进行格式化处理 
    ActiveWindow.View.Type = wdNormalView 
    Selection.EndKey Unit:=wdStory 
    Selection.Delete Unit:=wdCharacter, Count:=1 
    Selection.WholeStory 
    Selection.ConvertToTable Separator:=wdSeparateByTabs,  DefaultTableBehavior:=wdWord8TableBehavior 
    Selection.HomeKey Unit:=wdStory 
    Set Temp_Table = ActiveDocument.Tables(1) 
    Temp_Table.Rows.Alignment = wdAlignRowCenter 
    Temp_Table.AutoFitBehavior wdAutoFitContent 
    Temp_Table.Rows(1).Range.ParagraphFormat.Alignment = wdAlignParagraphCenter 
    Temp_Table.Rows(1).Range.Rows.HeadingFormat = wdToggle 
    Temp_Table.Borders(wdBorderLeft).LineWidth = wdLineWidth150pt 
    Temp_Table.Borders(wdBorderRight).LineWidth = wdLineWidth150pt 
    Temp_Table.Borders(wdBorderTop).LineWidth = wdLineWidth150pt 
    Temp_Table.Borders(wdBorderBottom).LineWidth = wdLineWidth150pt 
    Temp_Table.Range.Cells.VerticalAlignment = wdCellAlignVerticalCenter 
    Selection.HomeKey Unit:=wdStory 
    Selection.SplitTable 
    Selection.Font.Name = "黑体" 
    Selection.TypeText Text:=Title & vbCrLf 
    Application.ScreenRefresh 
    Msg = "数据提取完毕。" & vbCrLf & vbCrLf 
    Msg = Msg & "总记录数=" & total_records & " 条" 
    MsgBox Msg, vbOKOnly, "数据提取完毕" 
End Sub 
 

四、两种方法的比较 
1. 适用性 
上述两种方法都可以满足我们制作特殊报表的要求,但笔者认为access+ADO+Word更适合于进行多表的复杂查询,编制的东西也更有“程序味”,若既要求录入数据又要求输出特殊报表,可采用该方法;而Word+ADO非常适合于处理表格形式固定的报表,不负责数据录入,只要求输出报表的情况。 
2. 复杂性 
在程序的编写上,这两种方法也有一些小的差别:前者比后者略微复杂些,在对一些特殊命令的处理上两者也有一些不同。 
3. 对报表格式的控制 
由于Word本身就是个字处理软件,所以它对文档的控制也就比access对文档的控制更容易、更灵活,若对表格要求很高,采用后者会更加有效。 
4. 处理速度 
两者的处理速度基本相当。上述两段程序采用的都是先输出数据,再将其转换为表格的方法,这样处理主要是基于速度上的考虑,特别是对于几百条乃至上千条的记录,其处理速度是比较快的。另外,也可以直接向文档中输出表格,再逐行增加表格或逐单元格地填写数据,但对于大的报表来讲,其速度将大打折扣。影响处理速度的因素是多方面的,主要瓶颈是在Word中,如表格的复杂程度、页面视图、对象的使用,等等。 
五 总结 
上述的例子主要介绍了用ADO调用数据库的方法及在Access中调用Word的方法,其实这些方法在Office中是通用的,你可以将它应用在access、Word、Excel中,甚至可以应用在Outlook中。 
对于美的追求是永无止境的,如果你对access的报表设计器不满意,不妨试一试上述两种方法,相信它们一定会满足你哪怕是近乎苛刻的需求,使你的报表令上司更满意,令同事更羡慕,令你自己更欣慰。 

(责任编辑:admin)

顶一下
(0)
0%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价: