简介
无论是撰写电子邮件信函还是其他文档都没有任何一种程序能够与 Microsoft Office Word 的能力相比您可以访问强大的模板样式搜索服务等许多功能智能标记使您可以基于在 Word 文档中键入的文本来采取操作从而提供了更好的体验例如当您键入某个人的姓名时Word 可以将其识别为人员姓名并且允许您在自己的 Outlook 联系人中快速搜索该姓名并从那里采取操作
此功能非常适用于联系人但是如果是其他类型的内容会怎样呢?使用 Outlook您可以在 Exchange 邮件存储中存储任务联系人约会便笺电子邮件公告等许多内容能够标明文档中的字词并将它们连接到邮件存储中的上述其他内容类型的智能标记具有类似的价值但不存在这样的内置智能标记幸而您可以十分轻松地开发此类智能标记
注 本文假设读者了解智能标记的用法相应的智能标记 API 以及开发智能标记的基本过程有关开发智能标记的详细信息请参阅 MSDN Office 开发人员中心上智能标记门户的 Getting Started 部分
工作原理
该智能标记具有一个识别程序该程序可以对 Word 中的文本输入进行计算并确定键入的字词是否与预定义的搜索术语列表中的某个术语相匹配您负责创建该术语列表并将值存储在 XML 文件中智能标记 DLL 在 Word 首次加载智能标记时读取此文件并且将术语缓存在内存中图 显示了包含术语列表的 XML 文件的内容
图 用于识别的术语列表当 Word 发现键入的字词与列表中的某个术语相匹配时就会为匹配的字词指定一个属性从而将其标明为智能标记图 显示了一个 Word 文档中的已识别术语
图 用智能标记标明的已识别术语然后您可以通过将光标悬停在所标明字词的上方来激活智能标记菜单智能标记菜单显示了一个用于搜索邮箱的自定义项目(图 )
图 已识别术语的智能标记操作菜单单击该项目会使智能标记执行相应的代码以便在 Exchange 邮件存储中搜索收件箱中在主题行上包含该搜索术语的电子邮件智能标记在一个 Windows 窗体中显示结果该窗体带有一个 DataGrid其中列出了主题中包含该搜索术语的邮件项目(图 )
图 Windows窗体中的搜索结果在此例中DataGrid 仅显示电子邮件主题的字段以及发件人的信息但是它在幕后还检索其他电子邮件字段(如正文)尽管没有显示这些字段通过简单地更改网格的属性您可以显示这些隐藏字段本文稍后将说明如何完成该操作
该示例的最后一项功能是使您可以将所选电子邮件的主要文本插入到 Word 文档中您可以通过将光标悬停在 DataGrid 中某行的上方并右键单击该项目来完成此操作代码将电子邮件的主题和正文插入 Word 文档中紧邻启用智能标记的文本的后面(图 )
图 插入来自电子邮件的数据之后的文档内容当然您还可以更改此功能包括更改表格格式代码将哪些字段内容插入文档以及代码将这些字段内容放到何处
注 如何以编程方式设置 Word 内容的格式超出了本文的范围您可以通过参考本文结尾列出的资源来了解有关如何进行 Word 对象模型编程的更多信息
识别
智能标记代码中的主要识别功能是将文本输入与某个条件进行比较并确定该文本是否重要例如您可以根据硬编码列表(最不灵活但速度最快的机制)动态列表或正则表达式来进行比较本文的示例使用了一个 XML 文件(图 )该文件含有智能标记 DLL 在运行时加载的术语该 DLL 将加载的术语列表存储在内存中并使用它与文本输入进行比较以下为加载该 XML 文件并在内存中存储术语列表的代码
Public Sub SmartTagInitialize( _
ByVal ApplicationName As String) _
Implements SmartTagsISmartTagRecognizer _
SmartTagInitialize
Dim xmlDoc As New XmlXmlTextReader(SearchTermsxml)
While xmlDocRead
If xmlDocNodeType = XmlXmlNodeTypeText Then
ReDim Preserve termList(termCount)
termList(termCount) = xmlDocValue()
termCount = termCount +
End If
End While
End Sub
该代码在 SmartTagInitialize 事件激发时执行您还可以将智能标记编写为在其他时间加载列表或者定期检查是否有更新(这一切都需要不同但并不困难的代码)
该列表加载后Recognize 或 Recognize 方法中的代码可以使用它与用户在文档中键入的内容进行比较
注 当您实现上述接口以便在 Office 的各个版本中创建附加的智能标记识别器或操作处理程序时还可以实现旧式智能标记接口(版本 )或新式接口(版本 ) Smart Tag Type Library 包含了这两个接口版本 Recognize 方法属于版本 Recognize 方法属于版本 同样InvokeVerb 操作方法用于版本 而 InvokeVerb 用于版本 本文中的代码使用的是版本 方法
识别器主要用于确定给定的文本字符串是否相关您必须根据需要为此功能的逻辑编写代码下面是 Recognize 方法的逻辑
Dim i As Integer
Dim propbag As SmartTagsISmartTagProperties
Dim token As SmartTagsISmartTagToken
Try
Dim nToken As Integer
If Not TokenList Is Nothing Then
For nToken = To TokenListCount
= TokenListItem(nToken)
If Not token Is Nothing Then
For i = To termCount
If tokenTextToLower = termList(i)ToLower Then
propbag = RecognizerSiteGetNewPropertyBag
RecognizerSiteCommitSmartTag( _
SEARCH_NAMESPACE _
tokenStart tokenLength propbag)
End If
Next i
End If
Next
End If
Catch ex As Exception
Add exception handling code
End Try
该代码对作为 Recognize 方法的参数传递的 TokenList 集合进行遍历TokenList 集合包含有您希望代码对其进行计算的文本当您遍历该集合时会将它的项目与您在读取术语列表 XML 文件后存储在内存中的项目进行比较
当代码找到匹配项时它将得到一个新的 PropertyBag 对象并提交一个智能标记从而用一个命名空间属性有效地标明了识别的文本当您在 Word 中将光标悬停于该文本之上时应用程序将知道该文本以这种方式标明并显示一个在处理智能标记操作的类中指定的菜单
编写操作处理程序
识别只是智能标记技术的一部分功能您还需要为智能标记的操作编写代码这是最有趣的部分因为操作处理程序中的代码能够为您希望基于识别文本发生的操作提供功能在该示例中相应的操作是获得识别的术语并且在用户的 Exchange 收件箱中搜索以查找主题中包含该术语的项目代码会显示一个 Windows 窗体该窗体带有一个DataGrid其中包含搜索结果列表(图 )右键单击该网格中的搜索结果时会将项目的正文插入 Word 文档中紧邻智能标记文本的后面(图 )
下面是相应的代码
Try Select Case VerbID Case If ApplicationName = WordApplication Then Dim rngWord As WordRange = DirectCast(Target WordRange) Dim dv As DataView dv = UseWebDAV(rngWordText) If dvCount > Then Create a new instance of the Windows form with a DataGrid Add columns to the grid End If End If End Select Catch ex As Exception Add exception handling code End Try
该代码的大部分致力于设置 DataGrid 的格式(稍后将显示并解释相应的代码)该网格的数据源是从自定义函数 UseWebDAV 返回的 DataView此过程包含用于查询 Exchange 的代码
注InvokeVerb 方法具有一个参数表示智能标记文本所在的 Word Range 对象Target您必须将该参数强制转换为声明为 Range 的变量该代码使用 DirectCast()因为 Target 不需要转换
查询 Exchange
您可以用多种方式访问 Exchange 邮件存储包括 ADOADONETWebDAV 或简单 HTTP本文演示如何通过 WebDAV 检索项目WebDAV 是一种扩展 HTTP (请参阅 RFC )的协议您可以将 Microsoft Exchange Server 或 Microsoft Exchange Server 配置为允许使用该协议来访问它的数据存储区使用 WebDAV 时您将使用 XML 格式通过 HTTP 来发送请求而 Exchange 通过返回一个 XML 流来进行响应
注一种与使用 WebDAV 非常近似且需要类似查询语法的替代方法是使用 Outlook 对象模型中的 AdvancedSearch有关详细信息请参阅Microsoft Knowledge Base Article How to use the AdvancedSearch method to search for an item in Out