分享
 
 
 

Word域与数据库的结合编程

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

本文介绍了Word域与数据库结合的方法,给用户提供一个插入Word域的界面,并把数据库的数据填充到Word文件中。

域是Word中最具有实用价值的功能之一,它表示文档中可能发生变化的数据或邮件合并文档中套用信函、标签中的占位符。Microsoft Word 可以在您使用一些特定命令时插入域,如"插入"菜单上的"日期和时间"命令。您也可使用"插入"菜单上的"域"命令手动插入域。事实上,我们在日常工作中常会脱离Microsoft Word的操作环境。一般,用户是先建立好一些Word文件模板,然后利用所提供的应用程序功能向Word文件模板中插入域,用该域对应的值取代域值,这样就达到了向Microsoft Word文件中插入数据的作用。我们常把数据放入数据库中,数据库的内容不断地变化,我们的域值也跟着不断地变化,取到灵活自动更新的作用,要达到这方面的功能,就应该把数据库与Word域结合起来。

解决方法

首先要解决这一问题,我们必须先了解Word域有关的知识:Word域代码位于花括号或大括号 ( { } )中,域类似于 Microsoft Excel 中的公式:域代码类似于公式,域结果(域结果:当 Microsoft Word 执行域指令时,在文档中插入的文字或图形。在打印文档或隐藏域代码时,将以域结果替换域代码。)类似于公式产生的值。可在文档中切换显示域代码及其结果。正好,数据库的字段名对应域代码,字段值对应域值。我们利用VBA编程可以达到目的。VBA for Word 中有关域的类型很多,其中Type:=wdFieldAddin是一种关于字段与字段值对应的特殊域,正是借助它的功能解决问题。我们可以这么设想,用户先打开Word文件,然后向打开的Word文件中插入域,然后用数据库的数据填充。插入域时有二种可能,一种是单值域,即一个域代码对应一个域值(一对一关系),这种情况的域可以插入任何地方;另一种情况是多值域,即一个域代码对应多个域值(一对多关系)。这种情况的域只能插入表格中,并且当表格的行数比域值少时,要能自动提供增加表格行的功能。

实例说明

利用Visual Basic。Net编写通用的类,给用户提供可视化的编辑界面,用于用户在Word文件中插入域标志。针对Word文件或Excel表格文件,扫描整个文件,将其中的域标志取出来,然后通过从数据库中取出字段所对应的值,将值填写到文件中域对应的位置。若对应位置已有值,则判断该值与要填写的值是否相同,若不同则替换之。插入值分为:

A。单纯的值,直接使用一个值替换域。

B。表格中的单元格。若该表格填写不下,是否增加表格单元?以及与该单元关联的域等。

例如,有二个Access数据库的表(:表1对应单值域,表2对应多值域)如下:

利用VBA编写的一个通用的处理Word域的程序。开发步骤如下 :

1.建立项目,向项目中增加处理Word域的类

启动Visual Studio。NET。在新建项目中选择Visual Basic项目,在模板中选择Windows应用程序,把工程名更改为WordDoc。

● 向工程中增加名称为CWordDoc的类。

● 定义的CWordDoc类的属性。代码如下:

'定义Word应用对象及文档对象

Private wdApp As New Word..Application()

Private wdDoc As New Word.Document()

'所处理的Word模板文件

Private FileName As String

'域的个数及对应的数组

Dim FieldCount As Int16

Dim MyField()

'Word是否已运行

Private IsWordRunning As Boolean

'是否已经插入了表格行

Private IsInsertRow As Boolean

'Word工具栏对象及菜单栏对象数组

Dim CommandBarIndex() As Integer

Dim SaveCommandBarMenuIndex() As Integer

● 定义的CWordDoc类的方法。

定义打开Word文件的方法。建立Word应用对象和文档对象,并打开Word文件。设定Word已经运行。VBA编程主要是先建立某一个应用程序的对象,然后按需要处理应用对象。Word应用对象是“Word.Application”,通过CreateObject方法建立之。代码如下:

Public Sub OpenWordDocument(ByVal FileName As String)

wdApp = CreateObject("Word。Application")

wdApp.Documents。Open(FileName)

wdDoc = wdApp.ActiveDocument

wdDoc.ActiveWindow.DocumentMap = False

wdApp.Visible = True

IsWordRunning = True

End Sub

保存Word文件。 代码如下:

Public Sub SaveWordDocument()

wdDoc.SaveAs(FileName)

End Sub

定义Word环境的大小。

Word启动后一般是全屏幕(最大化),要把用户操作界面显示出来,不被Word遮蔽,处理的方法是把用户界面设为顶层窗体,也可使用户界面与Word各自处在自己位置,平行布置。这里是让用户界面位于屏幕的最顶上,Word位于用户界面的下面。因此要重新调整Word的位置,这需要设置Word窗体状态为普通类型(wdWindowStateNormal)。代码如下:

Public Sub SetWordSize(ByVal Left As Integer, ByVal top As Integer,

ByVal width As Integer, ByVal height As Integer)

wdApp。WindowState = Word.WdWindowState.wdWindowStateNormal

wdApp。Left = Left

wdApp。Top = top

wdApp。Width = width

wdApp。Height = height

End Sub

这里我们利用Word文档对象中域对象的Add方法向Word文件中插入域。域的Data属性代表该域的名称。插入域时应该选取插入点(Selection),即用户光标处位置。如果该位置是单元格且已插入域,应该提示是否覆盖。插入域时要分析是插入单值域还是多值域。根据关键字的后缀识别,关键字的最后一个字符是'F'时则为多值域。多值域只能插入在表格中。是否是表格以插入点的单元格识别。实现该功能的代码如下:

'在文档中插入域

'KeyWord:域的关键字

Public Function InsertField(ByVal KeyWord As String) As Integer

Dim mySelection As Selection

Dim Code As String

Dim MyField As Field

Dim myRange As Range

wdApp。Selection。Collapse(Direction:=wdCollapseEnd)

mySelection = wdApp。Selection

'插入点

If KeyWord。Chars(KeyWord。Length - 1) = "F" Then

If IsCell(mySelection) <> True Then

MsgBox("该位置不是单元格,请选择单元格", vbOKOnly + vbExclamation)

Exit Function

End If

End If

If IsCell(mySelection) = True Then

If CellFieldCount(mySelection) > 0 Then

If MsgBox("该单元格已有域,是否覆盖?", vbYesNo) = 6 Then

mySelection.Cells.Item(1).Select()

mySelection.Delete()

Else

Exit Function

End If

End If

End If

MyField = wdDoc.Fields.Add(Range:=mySelection.Range, Type:=wdFieldAddin)

MyField.Data = KeyWord

End Function

我们可以通过选择点的表格数判断插入点的性质。表格数为0,则选择点不位于单元格中,反则不位于单元格中。

'选择点(光标)是否是单元格。

Private Function IsCell(ByVal mySelection As Selection) As Boolean

If mySelection.Tables.Count > 0 Then

Return True

Else

Return False

End If

End Function

'计算选择点(光标)的单元格的域数

Private Function CellFieldCount(ByVal mySelection As Selection) As Integer

CellFieldCount = mySelection.Cells.Item(1).Range.Fields.Count

End Function

'记录插入域代码及关键字。这里主要是调用上面的InsertField方法。

Public Function InsertFieldByKeyWord(ByVal KeyWord As String) As Integer

Dim ID As Integer

FieldCount = FieldCount + 1

ReDim MyField(FieldCount)

ID = InsertField(KeyWord)

MyField(FieldCount).ID = ID

MyField(FieldCount).KeyWord = KeyWord

End Function

当Word文件已经插入了域,就要填充域值。填充域值应该分为二种情况考虑。一种是单值域,一种是多值域。单值域是一一对应关系,仅取出值域插入到对应的位置。实现的方法是扫描整个文档,找出是用户插入的域(Fields.Type = 81),用域值取代之,这里用到了一个由关键字得到值的方法GetFieldValues,这个方法在后面将会讲到,对应的是数据库的"工程"表。怎样保证永远仅插入一个值呢?方法是先清除掉原域值和域代码,再在当前插入点插入域代码和域值。实现的方法如下:

'用关键字对应的值插入值,在文档中在有域的地方插入对应的值

Public Function InsertValue() As Boolean

Dim i, Count

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有