设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 4435|回复: 6
打印 上一主题 下一主题

[报表] [求助]怎样保留以word发布的报表中的直线、边框?

[复制链接]
跳转到指定楼层
1#
发表于 2003-11-9 17:20:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[求助]
各位好,
     我在使用access中的“报表”发布成word文档时遇到困难,请求大侠们指点。谢谢。

目的:把相当多条记录做成报表(每条记录用一页报表),然后发送给对方。对方将针对每条记录的内容做出答复。

我的做法:在access中输入记录,把记录做成报表,然后以word文档发布形成word文档。把word文档发送给对方,等候对方在word文档上作答复。(方法有点笨哦)

遇到问题:当发布word成文档后,我在的access报表中用粗直线画的所有边框、格子都不见了,只剩下基本的标签、文本框等内容了。

求教:怎样才能在发布word文档中保留所有边框、格子?
      (当然若能把报表生成其他形式的文档也行,只要对方能编辑内容和保留报表的外观。)

[em03][em03]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2003-11-9 21:23:00 | 只看该作者
使用word模板,那些表格,边框 都已经画好啦的
其中需要 填写内容的地方 设置一些变量
然后在access中, 将必要字段 替换word中的变量,就可以啦
很好玩的功能
3#
 楼主| 发表于 2003-11-11 03:30:00 | 只看该作者
多谢老大。
可是,怎样在“需要 填写内容的地方”设置一些变量呢?
我只在数据库工具栏上找到了把整个表链接过来的方法。
老大,帮人帮到底吧。
ssecond2000@yahoo.com.cn
4#
发表于 2003-11-11 16:20:00 | 只看该作者
转载
另外你搜索一下
很多范例的


创建完美报表
作者:胡春林

    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中的数据进行格
5#
发表于 2003-11-11 18:31:00 | 只看该作者
寫得好
轉得好..
個人認為
如原兔兔所做,
做一個excel模板,
然后再填入數據,
會少寫很多代碼靈活些...
6#
 楼主| 发表于 2003-11-13 06:31:00 | 只看该作者
感谢老大们的关注!

对于兔兔大大第二贴中所授方法:
     方法一,试用成功。
     方法二,未成功,系统提示:用户定义类型未定义。
     但是,这两种方法涉及植入VB代码。对我而言,如ADAM大大所述,要想灵活应用有一定难度。
综上所述我渴望能使用兔兔大大第一贴中所授方法(模板法),只是大大言简意赅,我难窥全豹。希望兔兔大大再有所指点:
     疑问一:在word中的变量是怎样生成的?
     疑问二:在word中生成变量后,怎样建立链接到数据库中每条记录的字段值的呢?
     谢谢,先。






[此贴子已经被作者于2003-11-12 23:11:11编辑过]

7#
发表于 2003-11-13 16:51:00 | 只看该作者
使用模板也还是需要编程的
我这儿暂时还没有范例数据库,等有啦再上传吧

问题一: 实际上word的变量就是你敲入一个特殊的字符串
例如
代号        DH        级别        JB        起止
时间        MM月DD日HS时MS分
至MM月DD日HD时MD分
值勤
人员        ZQRY        记录员        JLY
                负责人        FZR

上述需要 填写的内容就使用 这些 字符串,然后还是用access的vba进行编程,就是找到这些你设定的字符串,然后找到他们,把他们一一替换为对应你提取的数据

范例代码其中一段,看看思路)

Dim vsWordApp As Word.Application
  On Error Resume Next
  Err.Clear

  Set vsWordApp = GetObject(, "Word.Application")
  If Err.Number Then
    Set vsWordApp = CreateObject("Word.Application")
    Err.Clear
  End If

  'If vsWordApp.Visible Then vsWordApp.Visible = False
  On Error GoTo ErrHandler
  
  Dim vsWordDoc As Word.Document
  vsWordApp.Documents.Add Template:=App.Path & "\" & Trim(strDocTemplateName)
  
  
  Set vsWordDoc = vsWordApp.ActiveDocument
  Dim vsrange As Word.Range
  Set vsrange = vsWordApp.ActiveDocument.Content

          With vsrange.Find
            .Execute FindText:="LSXH", replacewith:=Trim(Me.cboRecordSequence.Text), Replace:=wdReplaceAll
            .Execute FindText:="MM", MatchCase:=True, replacewith:=Month(Me.DTPStartTime.Value), Replace:=wdReplaceAll
            .Execute FindText:="DD", replacewith:=Day(Me.DTPStartTime.Value), Replace:=wdReplaceAll
            .Execute FindText:="HS", replacewith:=Hour(Me.DTPStartTime.Value), Replace:=wdReplaceAll
            .Execute FindText:="MS", MatchCase:=True, replacewith:=Minute(Me.DTPStartTime.Value), Replace:=wdReplaceAll
            .Execute FindText:="HD", replacewith:=Hour(Me.DTPEndTime.Value), Replace:=wdReplaceAll
            .Execute FindText:="MD", MatchCase:=True, replacewith:=Minute(Me.DTPEndTime.Value), Replace:=wdReplaceAll
            
            .Execute FindText:="DH", replacewith:=Trim(Me.cboTaskCode.Text), Replace:=wdReplaceAll
            .Execute FindText:="JB", replacewith:=Trim(Me.txtTaskLevel.Text), Replace:=wdReplaceAll
            .Execute FindText:="ZQRY", replacewith:=Trim(Me.cboRecordWatch.Text), Replace:=wdReplaceAll
            .Execute FindText:="JLY", replacewith:=Trim(Me.txtRecorder.Text), Replace:=wdReplaceAll
            .Execute FindText:="FZR", replacewith:=Trim(Me.txtResponser.Text), Replace:=wdReplaceAll
            .Execute FindText:="BT", replacewith:=Trim(Me.txtRecordTitle.Text), Replace:=wdReplaceAll
           
            Dim strTask As String
            If gCurGuardTask.TaskType = TaskType.BaoWei Then
                strTask = "保卫"
            End If
            If gCurGuardTask.TaskType = TaskType.JinWei Then
                strTask = "警卫"
            End If
            .Execute FindText:="JW", replacewith:=Trim(strTask), Replace:=wdReplaceAll
            
            Dim strXH() As String
            strXH = Split(Trim(Me.cboRecordSequence.Text), "―")
            
            .Execute FindText:="XH", replacewith:=strXH(UBound(strXH)), Replace:=wdReplaceAll
            '.Execute FindText:="CONTENT", replacewith:=gcurGuardRecorder.Content, Replace:=wdReplaceAll
          End With
         
          With vsWordApp.Selection.Find
            .Text = "CONTENT"
            .Wrap = wdFindContinue
            .Execute
            If UCase(vsWordApp.Selection) = "CONTENT" Then
              vsWordApp.Selection.Text = gcurGuardRecorder.Content
            End If
            vsWordApp.Selection.HomeKey Unit:=wdStory
          End With
         
         With vsWordApp.Selection.Find
            .Text = "YM"
            .Wrap = wdFindContinue
            .Execute
            If UCase(vsWordApp.Selection) = "YM" Then
         '       vsWordApp.Selection.Text = CStr(vsWordApp.Selection.HeaderFooter.PageNumbers.Count + 1)
            End If
        End With
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-15 05:07 , Processed in 0.098398 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表