利用Word域把数据库的数据插入Word文档中广东省电力设计研究院黎宇【摘要】本文介绍了Word域与数据库结合的方法,给用户提供一个插入Word域的界面,并把数据库的数据填充到Word文件中。
【关键词】 Word域 VBA 数据库 一.引言域是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 编写通用的类,给用户提供可视化的编辑界面,用于用户在Word文件中插入域标志。
针对Word文件或Excel表格文件,扫描整个文件,将其中的域标志取出来,然后通过从数据库中取出字段所对应的值,将值填写到文件中域对应的位置。
若对应位置已有值,则判断该值与要填写的值是否相同,若不同则替换之。
插入值分为:A.单纯的值,直接使用一个值替换域。
B.表格中的单元格。
若该表格填写不下,是否增加表格单元?以及与该单元关联的域等。
例如,有二个Access数据库的表(:表1对应单值域,表2对应多值域)如下:利用VBA编写的一个通用的处理Word域的程序。
开发步骤如下:1.建立项目,向项目中增加处理Word域的类启动Visual 。
在新建项目中选择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 Int16Dim MyField()'Word是否已运行Private IsWordRunning As Boolean'是否已经插入了表格行Private IsInsertRow As Boolean'Word工具栏对象及菜单栏对象数组Dim CommandBarIndex() As IntegerDim SaveCommandBarMenuIndex() As Integer●定义的CWordDoc类的方法。
定义打开Word文件的方法。
建立Word应用对象和文档对象,并打开Word文件。
设定Word已经运行。
VBA 编程主要是先建立某一个应用程序的对象,然后按需要处理应用对象。
Word应用对象是“Word.Application”,通过CreateObject方法建立之。
代码如下:Public Sub OpenWordDocument(ByV al FileName As String)wdApp = CreateObject("Word.Application")wdApp.Documents.Open(FileName)wdDoc = wdApp.ActiveDocumentwdDoc.ActiveWindow.DocumentMap = FalsewdApp.Visible = TrueIsWordRunning = TrueEnd Sub保存Word文件. 代码如下:Public Sub SaveWordDocument()wdDoc.SaveAs(FileName)End Sub定义Word环境的大小。
Word启动后一般是全屏幕(最大化),要把用户操作界面显示出来,不被Word遮蔽,处理的方法是把用户界面着为顶层窗体,也可使用户界面与Word各自处在自己位置,平行布置。
这里是把用户界面位于屏幕的最顶上,Word位于用户界面的下面。
因此要重新调整Word的位置。
要使Word能够调整,需要设置Word窗体状态为普通类型(wdWindowStateNormal)。
代码如下:Public Sub SetWordSize(ByV al Left As Integer, ByV al top As Integer, ByV al width As Integer, ByV al height As Integer)wdApp.WindowState = Word.WdWindowState.wdWindowStateNormalwdApp.Left = LeftwdApp.Top = topwdApp.Width = widthwdApp.Height = heightEnd Sub这里我们利用Word文档对象的域对象的Add方法向Word文件中插入域。
域的Data属性代表该域的名称。
插入域时应该选取得插入点(Selection),即用户光标处位置。
如果该位置是单元格且已插入域应该提示是否覆盖。
插入域时要分析是插入单值域还是多值域。
根据关键字的后缀识别,关键字的最后一个字符是‟F‟时则为多值域。
多值域只能插入在表格中。
是否是表格以插入点的单元格识别。
实现该功能的代码如下:'在文档中插入域'KeyWord:域的关键字Public Function InsertField(ByV al KeyWord As String) As IntegerDim mySelection As SelectionDim Code As StringDim MyField As FieldDim myRange As RangewdApp.Selection.Collapse(Direction:=wdCollapseEnd)mySelection = wdApp.Selection '插入点If KeyWord.Chars(KeyWord.Length - 1) = "F" ThenIf IsCell(mySelection) <> True ThenMsgBox("该位置不是单元格,请选择单元格", vbOKOnly + vbExclamation)Exit FunctionEnd IfEnd IfIf IsCell(mySelection) = True ThenIf CellFieldCount(mySelection) > 0 ThenIf MsgBox("该单元格已有域,是否覆盖?", vbY esNo) = 6 ThenmySelection.Cells.Item(1).Select()mySelection.Delete()ElseExit FunctionEnd IfEnd IfEnd IfMyField = wdDoc.Fields.Add(Range:=mySelection.Range, Type:=wdFieldAddin)MyField.Data = KeyWordEnd Function我们可以通过选择点的表格数判断插入点的性质。
表格数为0,则选择点不位于单元格中,反则不位于单元格中。
'选择点(光标)是否是单元格.Private Function IsCell(ByV al mySelection As Selection) As BooleanIf mySelection.Tables.Count > 0 ThenReturn TrueElseReturn FalseEnd IfEnd Function'计算选择点(光标)的单元格的域数Private Function CellFieldCount(ByV al mySelection As Selection) As IntegerCellFieldCount = mySelection.Cells.Item(1).Range.Fields.CountEnd Function…记录插入域代码及关键字。
这里主要是调用上面的InsertField方法。
Public Function InsertFieldByKeyWord(ByV al KeyWord As String) As IntegerDim ID As IntegerFieldCount = FieldCount + 1ReDim MyField(FieldCount)ID = InsertField(KeyWord)MyField(FieldCount).ID = IDMyField(FieldCount).KeyWord = KeyWordEnd Function当Word文件已经插入了域,就要填充域值。
填充域值应该分为二种情况考虑。
一种是单值域,一种是多值域。
单值域是一一对应关系,仅取出值域插入到对应的位置。
实现的方法是扫描整个文档,找出是用户插入的域(Fields. Type = 81),用域值取代之,这里用到了一个由关键字得到值的方法GetFieldV alues,这个方法在后面将会讲到,对应的是数据库的"工程"表。