首页 文章

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

提问于
浏览
3

对于我的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 回答

  • 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例程 .

相关问题