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