#c# #dll #ms-word
Вопрос:
Я создал приложение. Текст в расширенном текстовом поле хранится в word doc. с помощью библиотеки dll word interop. Теперь я хочу прочитать слово doc обратно в свой richtextbox.
Я привык oDoc.Content.Text
читать. Он работает, но выравнивания нет. Мне нужно загрузить ту же информацию в word doc.
А также я использовал этот код
oDoc.Activate();
oDoc.ActiveWindow.Selection.WholeStory();
oDoc.ActiveWindow.Selection.Copy()
IDataObject data = Clipboard.GetDataObject();
txtdocument.Text = Clipboard.GetDataObject()
.GetData(DataFormats.Text).ToString();
Но это приводит к этой ошибке:
Ссылка на объект не установлена на экземпляр объекта.
Ответ №1:
Является ли ваша программа однопоточной квартирой? Если нет Clipboard
, то класс не будет работать.
Класс буфера обмена можно использовать только в потоках, настроенных на режим однопоточной квартиры (STA). Чтобы использовать этот класс, убедитесь, что ваш основной метод отмечен атрибутом STAThreadAttribute.
Комментарии:
1. Я попытался установить атрибут STAThreadAttribute, но он выдает эту ошибку, не удалось установить указанное состояние COM-квартиры.
2. @jafrywilson: Вы использовали
System.Threading.Thread.CurrentThread.SetApartmentState
? Если это так, вам нужно вместо этого добавить [STAThread] перед вашим замедлением Main ().3. Мой метод заключается в следующем [STAThread] private void ReadWordDoc() { Microsoft. Офис. Взаимодействие.Слово. Класс приложений oWordApplic = новый Microsoft. Офис. Взаимодействие.Слово. Класс приложений();
4. строка strFilePath = «D:\wilson\tms\Documents\IND2011-2012\TB_CNR_IND_270520114946.doc»; объект objFile = strFilePath; объект отсутствует = Система. Отражение. Недостающий. Значение; объект objReadOnly = ложь; видимость объекта = истина;
5. Майкрософт. Офис. Взаимодействие.Слово. Документ oDoc = oWordApplic. Документы. Открыть(файл ref, ссылка отсутствует, ссылка только для чтения, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует, ссылка отсутствует); oDoc. Активировать(); //txtdocument. Текст = oDoc.Содержание. Текст; oDoc. Активное окно. Выбор. Вся история(); oDoc. Активное окно. Выбор. Копировать(); Поток. Текущий поток. SetApartmentState(ApartmentState.STA);
Ответ №2:
Возможно, это Clipboard.GetDataObject();
возвращает нулевую ссылку, а затем в самой последней строке вы пытаетесь получить доступ к ее члену
txtdocument.Text = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();
В любом случае, просто в качестве предложения, почему бы вам не заменить последнюю строку
txtdocument.Text = Clipboard.GetDataObject().GetData(DataFormats.Text).ToString();
с этим:
txtdocument.Text = data.GetData(DataFormats.Text).ToString();
ПРАВКА: проверьте, является ли одна из ваших переменных oDoc, txtDocument или data нулевой..
НОВОЕ РЕДАКТИРОВАНИЕ :
Thread tempThread = new Thread(new ThreadStart(threadstuff))
tempThread.SetApartmentState(System.Threading.ApartmentState.STA);
tempThread.Start();
Комментарии:
1. В этой строке объект данных возвращает нулевое значение IDataObject data = Буфер обмена. GetDataObject();
2. Вот к чему я клоню. Вот почему он выдает ошибку «Ссылка на объект не установлена на экземпляр объекта».. Можете ли вы показать часть кода, в которой вы создали новый экземпляр потока и вызвали метод-член SetApartmentState?
3. на предыдущий ответ я ответил своим методом