在Word(VSTO)中并排比较两个RTF文档

时间:2011-02-10 20:28:26

标签: c# .net ms-word vsto rtf

对于我的VSTO Word解决方案,我需要以编程方式“比较”两个文档并排。换句话说,我需要从代码中执行相同的单击 View>并排显示按钮。

我在加载两个文档后尝试使用CompareSideBySideWith方法。抛出异常:“请求的集合成员不存在”。我不是第一个遇到这个的人;请参阅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命令,否则不会打开(按下)。


更新:上述示例中仍然抛出异常,涉及两个新文档; 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来自何处)。


更新2: 像往常一样,一行代码解决了几天追逐一个人的问题:

doc1.Convert(); // Updates the document to the newest object model (i.e. DOCX)

现在可以毫无问题地并排比较。

1 个答案:

答案 0 :(得分:3)

反转您的文件比较,应该没问题:

对于新文件

Document doc1 = this.word.Documents.Add(ref missing, ref missing, ref missing, ref missing);
Document doc2 = this.word.Documents.Add(ref missing, ref missing, ref missing, ref missing);
object o = doc1;
doc2.Windows.CompareSideBySideWith(ref o);

对于现有文件

object missing = System.Reflection.Missing.Value;
object newFilename1 = "C:\\Test\\Test1.docx";
Document doc1 = this.word.Documents.Open(ref newFilename1, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);

object newFilename2 = "C:\\Test\\Test2.docx";
Document doc2 = this.word.Documents.Open(ref newFilename2, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing);
object o = doc1;
doc2.Windows.CompareSideBySideWith(ref o);

如果您的应用程序不可见或者您正在启动Word的新实例,则应在运行文档打开之前设置this.word.Visible = true;,因为CompareSideBySideWith是一个UI例程。