一个项目要求用 Java 调用 Word 的 Wildcards 搜索功能,并将搜索的全部结果存入数据库。该项目使用 JACOB 作为操作的 Word 的接口,JACOB 是 Java 和 COM 的“桥”。

我对 Java 不熟,也没时间研究如何使用 JACOB,于是我使用 C# 调用 Office Component,反正 JACOB 是基于 JNI 调用 COM,我只要找到解决问题的方法即可。让项目组熟悉 Java 和 JACOB 的同事改写一份即可,这个主意我不错,开工吧。

1、如何调用 Wildcards 搜索

Application 和 Document 接口没有提供 Find 或 Serach 方法,要实现搜索的功能,我们需要使用 Selection 或 Range 接口,这两个接口提供了 Find 属性(Property)。

实际上,Word 提供了一个名称叫 Find 接口,Range 对象的 Find 属性就是该类型的,搜索功能主要由该接口实现。针对我们要实现的功能,主要设置 Forward、MatchWildcards、Text 三个属性,然后调用 Execute 方法,如果找到了匹配的结果则返回 true,否则返回 false。

2、如何取得搜索结果

Wildcards 搜索的“表达式”有些类似于“正则表达式”,因此如何取得搜索到的结果成了新问题,这也是同事迟迟没有搞定的。

花了很多时间写测试代码,搜索 MSDN 中关于 Range 对象和 Find 对象的帮助,最后终于找到了下面这段话。真相大白于天下!!!

用 C# 实现 Word 的搜索功能

当我们使用 Range 对象进行搜索时,找到第一个匹配的字符串时,“源 Range 对象”将被 Redefined,也就是说,搜索的结果是存储在“用来搜索用的 Range 对象中”

3、如何实现搜索下一条(Find Next)

解决了搜索结果的问题,我们又遇到了新的问题。既然用来搜索用的 Range 对象已经改变,我们如何实现 Find Next 功能???

很简单,从匹配字符串的“下一个字符”继续搜索。说起来容易,如何实现呢?

我们是使用 Document 对象的 Range 方法来取得 Range 对象的,那么,只需看看 Range 的原型即可:

用 C# 实现 Word 的搜索功能

需要注意的是,省略 Start 参数时,默认从 Document 的第一个字符开始;省略 End 参数时,默认到 Document 的最后一个字符结束。

4、C# 调用 COM 的注意内容

Office Component 对象中的方法,通常提供 N 个参数,基本上都是 Object 的 ref 类型,给开发带来很多不便。还好,在 .Net 中提供了 Type.Missing 字段(Field),不想传递值的参数(Argument)使用该字段即可。

5、VB.NET 和 C# 的选择

我对 C# 熟悉一些,使用 .Net 之后几乎所有的测试代码都用 C# 完成。在历经了 N 次操作 Office Component 的痛苦之后,我强烈推荐大家使用 VB.NET 操作 Office Component。反正 .Net 支持多语言,我们完全可以使用 VB.NET 写好 Class Library 在 C# 中调用。

以下是我使用 Reflector 对 VB.NET 代码的分析,编译器帮我们做了很多工作(请注意反编译后的第 5~7 行代码),真的很方便!!!

End Function

End Function

6、参考资料

我发现长期培养的直觉,面对 Office 对象模型几乎没有任何作用,看来,要想做 Office 开发首先是静下心来熟悉 Office 对象模型,经验主义在这儿是行不通的,呵呵。

我机器使用的是 MSDN for Visual Studio 2005,下面的两行文字是查找 Office 帮助的路径,希望能有所帮助。

  • Office Solutions Development/Microsoft Office 2003 Documentation/Office 2003/VBA Language Reference/Microsoft Word Visual Basic Reference
  • Development Tools and Lanauge/Visual Studio/Visual Studio Tools for Office/Reference/Microsoft Office Word Primary Interop

7、参考代码

}

相关文章:

  • 2021-08-20
  • 2021-11-18
  • 2021-11-21
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-11
猜你喜欢
  • 2022-01-11
  • 2021-07-31
相关资源
相似解决方案