Приложение Word Interop для записи текста в конец открытого документа

#c# #interop #ms-word

#c# #взаимодействие #ms-word

Вопрос:

Я пытаюсь написать приложение на C #, которое найдет документ, открытый в MS Word, и запишет некоторый текст в конец документа, используя word interop. Возможно ли это?

Я знаю, что эту проблему можно отчасти решить, используя Process и Sendkeys, встроенные в .NET Framework, но я хотел бы решить проблему с помощью Word Interop, чтобы я мог добавить больше функциональности в будущем (также sendkeys действительно решали бы проблему только в определенных особых случаях.)

Спасибо!

Обновить:

У меня работает следующее частичное решение:

     Application wordApp = new Application();
    wordApp.Visible = true;
    wordApp.Documents.Add();
    Range rng = wordApp.ActiveDocument.Range(0, 0);
    rng.Text = "New Text";
  

Но я хотел бы использовать уже открытый экземпляр word вместо создания нового. Спасибо!

Обновление 2:

Я близок! Следующий код работает с отключенным UAC

     Application wordApp = (Word.Application)Marshal.GetActiveObject("Word.Application");
    Range rng = wordApp.ActiveDocument.Range(0, 0);
    rng.Text = "New Text";
  

Но я не уверен, как заставить его работать с включенным UAC. UAC не вызывает никаких ошибок или исключений, он просто не записывает текст в открытый документ.

Спасибо всем за помощь, конец уже виден :)!

Обновление 3:

Просто попробовал еще раз с включенным UAC, и это сработало … странно. Тем не менее, если вы знаете какие-либо хорошие ресурсы о взаимодействии и UAC в целом, пожалуйста, разместите ссылку здесь!

Ответ №1:

Рассматривали ли вы возможность использования Marshal.GetActiveObject("Word.Application") для запуска приложения вместо создания нового?

Комментарии:

1. Спасибо!! Только что сделал, и, похоже, он получает открытый экземпляр word, но не отправляет текст (текст отправлялся через код в части обновления моего вопроса). Может ли это быть проблемой UAC? (Я тестирую на Win 7 box)

2. Я перезапустил компьютер с отключенным UAC, и он начал работать. Затем я снова перезапустил компьютер, после повторного включения UAC, снова попробовал программу, и она сработала. Надеюсь, я в конце концов доберусь до сути! Хотя спасибо за ваш ответ.

3. Есть ли у вас особая причина ожидать проблем, связанных с UAC? Если ваше приложение и Word запущены от имени одного и того же пользователя, я не думаю, что возникнет такая проблема.

Ответ №2:

Определенно Эван. Сборки взаимодействия Microsoft Office позволяют выполнять практически все, что угодно, используя C #! Проблема с SendKeys().

http://msdn.microsoft.com/en-us/library/15s06t57 (v = против80).aspx

Думаю, мне следует подробнее рассказать о SendKeys (): она даже больше не работает надежно, поскольку была основным хакерским инструментом. Сборки взаимодействия MS Office позволяют выполнять огромное количество действий с каждым из компонентов Office. Я широко использовал их с MS Excel и некоторые с Word, и вы можете делать практически все, что пользователь может сделать программно.

Комментарии:

1. Спасибо за помощь! Я кое-чего добился, перейдя по предоставленной вами ссылке. Теперь мне просто нужно знать, как подключиться к активному окну word (см. Мое обновление q). Вы знаете, что я мог бы это сделать, или вы знаете пример в Интернете, который я пропустил? Еще раз спасибо!

Ответ №3:

Вы можете попробовать ниже.Здесь я привожу пример со вставкой изображения.

  WordC.Application wordApp = new WordC.Application();
                //  create Word document object
                WordC.Document aDoc = null;
                object readOnly = false;
                 object isVisible = false;
                 wordApp.Visible = false;
               //  wordApp.DisplayAlerts = false;
//docFileName is the filename with complete path. ex c://test.doc

                 aDoc = wordApp.Documents.Open(docFileName, Type.Missing, ref readOnly, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, ref isVisible, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
aDoc.Activate();
aDoc.InlineShapes.AddPicture(imgFilename, Type.Missing, Type.Missing, Type.Missing);

                aDoc.Save();
                aDoc.Close(Type.Missing, Type.Missing, Type.Missing);
                wordApp.Quit(Type.Missing, Type.Missing, Type.Missing);