对于我的VSTO Word解决方案,我需要以编程方式"compare"两个文档并排 . 换句话说,我需要从代码中执行相应的单击View> Show Side by Side按钮 .
我在加载两个文档后尝试使用CompareSideBySideWith方法 . 抛出异常:"The requested member of the collection does not exist" . 我不是第一个遇到这个的人;请参阅this thread中的Microsoft(样板文件,不是特别有用)回复 . MS代表最终挠挠头,放弃了 .
我甚至尝试打开两个空白文档并进行比较 . 这个时间也没有异常,但比较没有发生,CompareSideBySideWith()返回false .
Document doc1 = this.word.Documents.Add(ref missing, ref missing, ref missing, ref missing);
object doc2 = this.word.Documents.Add(ref missing, ref missing, ref missing, ref missing);
doc1.Windows.CompareSideBySideWith(ref doc2);
有人发现了解决方法吗?在自定义解决方案中使用它似乎是一项非常基本的功能 .
注意:我们需要调用实际的“并排”比较,而不仅仅是通过Windows.Arrange()来安排窗口 . 这部分是因为我们的功能区包含View Side by Side按钮的别名,除非成功调用实际的Side by Side命令,否则不会打开(按下) .
Update :上述示例中仍然抛出异常,涉及两个新文档; Word吞下了异常,因为我在try-catch块之外尝试了它 .
Per Otaku下面我尝试调用doc2.Windows.Compare(ref doc1),这适用于空白文档以及从Word 2007保存为.docx和.rtf的测试文档 .
但是,我们需要比较另一个RTF编辑器保存为RTF的文档 . 当我加载我们的一个文档时,它失败了 . 要重现我的错误,请尝试加载从写字板保存的RTF文档 - 这些文档也会失败 . 我试过修补Documents.Open()的Encoding和Format参数无济于事 . 最好避免将临时文件转换并保存为.docx,特别是对于较大的文档!另请注意,我可以在手动打开写字板保存的RTF文件后单击“并排查看”,并且可以正常工作 .
此外,似乎重要的是比较文档的格式(作为参数传递给Windows.CompareSideBySideWith()的文档是什么 . 例如,如果我们在Otaku的示例中执行doc2.Windows.CompareSideBySideWith(ref doc1),它当doc1是常规docx但不是从WordPad保存的RTF时,它可以工作 . (无论doc2来自何处) .
Update 2: 像往常一样,一行代码解决了几天追逐尾巴的问题:
doc1.Convert(); // Updates the document to the newest object model (i.e. DOCX)
现在可以毫无问题地并排比较 .
1 回答
反转您的文件的比较,它应该是好的:
对于新文件
对于现有文件
如果您的应用程序不可见或者您正在启动Word的新实例,则应在运行文档打开之前设置
this.word.Visible = true;
,因为CompareSideBySideWith
是一个UI例程 .