Russian Qt Forum

Qt => ActiveX => Тема начата: R_a_f_f от Ноябрь 22, 2007, 17:27



Название: ActiveQt and Word
Отправлено: R_a_f_f от Ноябрь 22, 2007, 17:27
Доброго времени суток!!! Возникла проблема при работе с Word в Qt. Заключается в следующем:

Код:
QAxObject* WordApplication=new QAxObject("Word.Application"); // Создаю интерфейс к MSWord
QAxObject* WordDocuments = WordApplication->querySubObject( "Documents()" ); // Получаю интерфейсы к его подобъекту "коллекция открытых документов":
QAxObject* NewDocument = WordDocuments->querySubObject( "Add()" ); // Создаю новый документ
WordApplication->setProperty("Visible", true); // Делаем Word видимым


Как же теперь в этот новый документ что-нибудь программно вставить(Например текст "123456")? Буду очень признателен за любую помощь.


Название: Re: ActiveQt and Word
Отправлено: R_a_f_f от Ноябрь 23, 2007, 09:43
Уважаемые!!! Неужели никто ничто не может ответить??? Вопрос может показаться глупым, но это не так. Прочитав все сообщения на форуме и испробовав множество предложенных вариантов(Начиная от Visual Basic и заканчивая dumpcpp) к решению данной задачи не пришёл. :(


Название: Re: ActiveQt and Word
Отправлено: Tonal от Ноябрь 23, 2007, 11:49
Для документа получи регион по умолчанию, (Range) и зави его функцию InsertAfter
Это, а так же многое другие интересные вещи можно узнать из встроенной в Ворд справке по VBA.
Так же эта информация присутствует в любом MSDN-е.
Кроме того, в самом Ворде можно включить запись макроса, проделать нузные действия руками и после отключения записи полюбоваться на результат во встроенном редакторе VBA.
Ну и гугль вроде бы некто не отменял. :-)


Название: Re: ActiveQt and Word
Отправлено: R_a_f_f от Ноябрь 23, 2007, 14:19
В этом то и загвоздочка!!! Не удаётся получить Range документа. Ругается что у Word.Application нет такого метода и предлагает выбрать из списка кандитатов. Точно такая же ситуация и с VisualBasic: Записываю макрос
Код:
Selection.TypeText Text = "123456"
. Пробую этот макрос запрограммировать, но не получается. Ругается что у Word.Application нет такого метода и предлагает выбрать из списка кандитатов. Это же подтверждается(что нет такого метода) при использование dumpdoc word.application. Создаётся файл со списком доступных свойств, мотодов, функций в которм Range отсутствует. Тут пришла мыслишка в голову, может быть это всё из-за того что установлен пакет OFICCE 2007?


Название: Re: ActiveQt and Word
Отправлено: Tonal от Ноябрь 24, 2007, 18:36
Я же написал для документа а не для приложения.
Внимательнее нужно быть и всё получится! :-)


Название: Re: ActiveQt and Word
Отправлено: R_a_f_f от Ноябрь 25, 2007, 18:50
Проблема решена!!! На самом деле есть несоответствия в том какие команды использует Visual Basic и какие необходимо использовать при работе в Qt. Доберусь до работы попробую выложить, думаю многим пригодится. Всем спасибо.


Название: Re: ActiveQt and Word
Отправлено: R_a_f_f от Ноябрь 28, 2007, 15:59
Как и обещал выкладываю код для работы с Microsoft Word:
Код:
QAxObject* WordApplication=new QAxObject("Word.Application"); // Создаю интерфейс к MSWord
QAxObject* WordDocuments = WordApplication->querySubObject( "Documents()" ); // Получаю интерфейсы к его подобъекту "коллекция открытых документов":
WordDocuments->querySubObject( "Add()" ); // Создаю новый документ
// отключение грамматики
QAxObject* Grammatic = WordApplication->querySubObject("Options()");
Grammatic->setProperty("CheckSpellingAsYouType(bool)", false); // отключение грамматики
QAxObject* ActiveDocument = WordApplication->querySubObject("ActiveDocument()");
QAxObject* Range = ActiveDocument->querySubObject("Range()");
// создание таблицы
QAxObject* Tables = ActiveDocument->querySubObject("Tables()");
QAxObject* NewTable = Tables->querySubObject("Add(Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior)", ActiveDocument->dynamicCall("Range()"), 4, 4, 1, 1);
// запись текста в ячейку
QAxObject* Cell = NewTable->querySubObject("Cell(Row, Column)", 1,1);
QAxObject* CellRange = Cell->querySubObject("Range()");
CellRange->dynamicCall("InsertAfter(Text)", "Это ячейка 1:1");

Возникла ещё одна проблема. При добавлении новой таблицы весь текст, который мы отправляли в Word до этого заменяется на эту новую таблицу. Каким же образом при использовании метода Tables.Add(Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior) указать правильно Range?


Название: Re: ActiveQt and Word
Отправлено: Axel от Декабрь 06, 2007, 18:25
Здравствуйте всем!!!
R_a_f_f большое спасибо за пример...
У меня возникла проблема с поиском и заменой текста... нужна помощь  ???


Название: Re: ActiveQt and Word
Отправлено: dushabest85 от Август 08, 2010, 07:35
Доброго времени суток, возникла проблема. При добавлении новой таблицы весь текст, который мы отправляли в Word до этого заменяется на эту новую таблицу. Каким же образом при использовании метода Tables.Add(Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior) указать правильно Range? Подскажите пожалуйста, ни где не могу найти как это сделать? Пробовал записать макросы в ворде, но там какая то ерунда, в qt так не работает...


Название: Re: ActiveQt and Word
Отправлено: CroCIV от Сентябрь 15, 2010, 15:46
Доброго времени суток, возникла проблема. При добавлении новой таблицы весь текст, который мы отправляли в Word до этого заменяется на эту новую таблицу. Каким же образом при использовании метода Tables.Add(Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior) указать правильно Range? Подскажите пожалуйста, ни где не могу найти как это сделать? Пробовал записать макросы в ворде, но там какая то ерунда, в qt так не работает...

А что утебя передается в Range функции  Tables.Add( ?