Сравнение двух документов RTF бок о бок в Word (VSTO) - PullRequest
3 голосов
/ 10 февраля 2011

Для моего решения VSTO Word мне нужно программно"сравнить" два документа бок о бок.Другими словами, мне нужно из кода выполнить эквивалент нажатия кнопки Вид> Показать рядом .

Я пытался использовать метод CompareSideBySideWith после загрузкидва документа.Выдается исключение: «Запрашиваемый элемент коллекции не существует».Я не первый, кто сталкивается с этим;см. ответы 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);

Кто-нибудь нашел обходной путь для этого?Кажется, довольно простой элемент функциональности - иметь собственное решение.

Примечание. Нам нужно вызывать фактическое сравнение "Side by Side", а не просто упорядочивать окна с помощью Windows.Arrange ().Это отчасти потому, что наша лента содержит псевдоним для кнопки «Просмотр рядом», который не будет включен (нажат), пока не будет успешно вызвана действительная команда «Рядом».


Обновление : исключение все еще было сгенерировано в приведенном выше примере с двумя новыми документами;Word проглотил исключение, потому что я попробовал его за пределами моего блока try-catch.

В соответствии с нижеприведенным отаку я попытался вызвать doc2.Windows.Compare (ref doc1), и это работало как для пустых документов, так и для тестовых документов.сохранены как .docx и .rtf из Word 2007.

Однако нам нужно сравнить документы, сохраненные в формате RTF, из другого редактора RTF.Когда я загружаю один из наших документов, он не работает.Чтобы воспроизвести мою ошибку, попробуйте загрузить документы RTF, сохраненные из WordPad - они тоже не работают.Я попытался изменить параметры Encoding и Format для Documents.Open (), но безрезультатно.Было бы неплохо избежать преобразования и сохранения временного файла в формате .docx, особенно для больших документов!Также обратите внимание, что я могу нажать «Просмотр рядом» после открытия файлов RTF, сохраненных в WordPad вручную, и это работает.

Кроме того, кажется, что имеет значение только, в каком формате сравнивать документ (документ, передаваемый в качестве параметра вWindows.CompareSideBySideWith () находится в. Например, если мы делаем doc2.Windows.CompareSideBySideWith (ref doc1), как в примере Otaku, он работает, когда doc1 является обычным docx, но не когда это RTF, сохраненный из WordPad. (Независимо ототкуда пришел doc2).


Обновление 2: Как обычно, одна строка кода разрешает несколько дней погони за хвостом:

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

Может теперьсравнивайте бок о бок без проблем.

1 Ответ

3 голосов
/ 11 февраля 2011

Отмените сравнение ваших документов, и все должно быть в порядке:

Для новых документов

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);

Если ваше приложение не 't или вы запускаете новый экземпляр Word, вы должны установить this.word.Visible = true; перед запуском открытия документов, так как CompareSideBySideWith является процедурой пользовательского интерфейса.

...