本文介绍了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 BasicNet编写通用的类给用户提供可视化的编辑界面用于用户在Word文件中插入域标志针对Word文件或Excel表格文件扫描整个文件将其中的域标志取出来然后通过从数据库中取出字段所对应的值将值填写到文件中域对应的位置若对应位置已有值则判断该值与要填写的值是否相同若不同则替换之插入值分为
A单纯的值直接使用一个值替换域
B表格中的单元格若该表格填写不下是否增加表格单元?以及与该单元关联的域等
例如有二个Access数据库的表(表对应单值域表对应多值域)如下
利用VBA编写的一个通用的处理Word域的程序开发步骤如下
建立项目向项目中增加处理Word域的类
启动Visual StudioNET在新建项目中选择Visual Basic项目在模板中选择Windows应用程序把工程名更改为WordDoc
● 向工程中增加名称为CWordDoc的类
● 定义的CWordDoc类的属性代码如下
定义Word应用对象及文档对象
Private wdApp As New WordApplication()
Private wdDoc As New WordDocument()
所处理的Word模板文件
Private FileName As String
域的个数及对应的数组
Dim FieldCount As Int
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应用对象是WordApplication通过CreateObject方法建立之代码如下
Public Sub OpenWordDocument(ByVal FileName As String)
wdApp = CreateObject("WordApplication")
wdAppDocumentsOpen(FileName)
wdDoc = wdAppActiveDocument
wdDocActiveWindowDocumentMap = False
wdAppVisible = True
IsWordRunning = True
End Sub
保存Word文件 代码如下
Public Sub SaveWordDocument()
wdDocSaveAs(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)
wdAppWindowState = WordWdWindowStatewdWindowStateNormal
wdAppLeft = Left
wdAppTop = top
wdAppWidth = width
wdAppHeight = 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
wdAppSelectionCollapse(Direction:=wdCollapseEnd)
mySelection = wdAppSelection插入点
If KeyWordChars(KeyWordLength ) = "F" Then
If IsCell(mySelection) <> True Then
MsgBox("该位置不是单元格请选择单元格" vbOKOnly + vbExclamation)
Exit Function
End If
End If
If IsCell(mySelection) = True Then
If CellFieldCount(mySelection) > Then
If MsgBox("该单元格已有域是否覆盖?" vbYesNo) = Then
mySelectionCellsItem()Select()
mySelectionDelete()
Else
Exit Function
End If
End If
End If
MyField = wdDocFieldsAdd(Range:=mySelectionRange Type:=wdFieldAddin)
MyFieldData = KeyWord
End Function
我们可以通过选择点的表格数判断插入点的性质表格数为则选择点不位于单元格中反则不位于单元格中
选择点(光标)是否是单元格
Private Function IsCell(ByVal mySelection As Selection) As Boolean
If mySelectionTablesCount > Then
Return True
Else
Return False
End If
End Function
计算选择点(光标)的单元格的域数
Private Function CellFieldCount(ByVal mySelection As Selection) As Integer
CellFieldCount = mySelectionCellsItem()RangeFieldsCount
End Function
记录插入域代码及关键字这里主要是调用上面的InsertField方法
Public Function InsertFieldByKeyWord(ByVal KeyWord As String) As Integer
Dim ID As Integer
FieldCount = FieldCount +
ReDim MyField(FieldCount)
ID = InsertField(KeyWord)
MyField(FieldCount)ID = ID
MyField(FieldCount)KeyWord = KeyWord
End Function
当Word文件已经插入了域就要填充域值填充域值应该分为二种情况考虑一种是单值域一种是多值域单值域是一一对应关系仅取出值域插入到对应的位置实现的方法是扫描整个文档找出是用户插入的域(FieldsType = )用域值取代之这里用到了一个由关键字得到值的方法GetFieldValues这个方法在后面将会讲到对应的是数据库的工程表怎样保证永远仅插入一个值呢?方法是先清除掉原域值和域代码再在当前插入点插入域代码和域值实现的方法如下
用关键字对应的值插入值在文档中在有域的地方插入对应的值
Public Function InsertValue() As Boolean
Dim i Count