Что нового

COM специфика работы с Word

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Где бы почитать документацию или примеры по связи AutoIT с Word используя COM объекты?
По примерам в справке разобраться практически нереально...
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Еще не понял что с этим можно делать, но в WinXP нашел интересную штуку:
Пуск - Выполнить - dcomcnfg
или
Win+R - dcomcnfg

Вроде бы и по делу, вроде и первоисточник (СОМ приложения системы), а что с этим делать не понятно... :whistle:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Mr. Anderson [?]
Вроде бы и по делу, вроде и первоисточник (СОМ приложения системы), а что с этим делать не понятно...
Вы можете использовать ActiveX/COM/OLE объекты в своих приложениях.
На странице MSDN (ссылку на которую вам дал Kaster), присутствуют все методы и свойства объектов Word.
Ну, к примеру, метод Open объекта Documents.
Вот пример:
Код:
$Word = ObjCreate("Word.Application")
$Word.Visible = True
$Word.Documents.Open("C:\MyDocument.doc")
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Mr. Anderson
Прежде всего определитесь как именно Вы хотите взаимодействовать с MS Office Word
через COM-сервер или OLE-сервер.
И определитесь с тем, хотите ли Вы решить конкретную задачу или получить общее представление...
В любом случае обращайтесь... "я на этом собаку съел" :smile: подскажу с практически 100% вероятностью, можно в ЛС, можно и в теме (так даже будет полезней)
По большому счету из UDF-ов Excel.au3 и Word.au3 Вам будет необходимы только несколько функций которые позволяют получить ссылку на COM-объект конкретного документа, все остальные действия осуществляются по правилам VBA (Visual Basic For Applications).
В самом Word нажмите сочетание клавишь Alt+F11 и вы попадедете во встроенну в Office IDE,
там соответсвенно в справку - а в ней есть все, описание методов и свойств, общее представление об объектной модели, константы и т.д.
PS: Костанты VBA как таковые OLE-сервер Office не понимает, используйте их числовые эквиваленты.
Когда будете эксперементировать можете попасть в ситуацию когда скрипт завершил работу с ошибкой, а Word как бы завис, на самом деле это скорее всего будет не так (если Вы конечно его не отправили в бесконечный цикл - тогда Ctrl+Pause Break) в остальных случаях
дело в значении объектWord.Application.ScreenUpdate = 0, выполнение объектWord.Application.ScreenUpdate = 1 решит проблемму.
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Kaster [?]
а можно поинтересоваться, в чем разница?
и даже нужно :smile: ...
Приступим:
С программами Microsoft Office Word, Excel и другими можно работать как с объектами автоматизации OLE. Этот подход существенно отличается от работы с этими программами как с серверами СОМ или от использования компонентов страницы Servers. Работа с объектами автоматизации может быть организована двумя способами: через библиотеки типов и через механизм автоматизации OLE.
Использование библиотеки типов имеет то преимущество, что обеспечивает проверку типов, но для работы с библиотекой типов надо сформировать соответствующий файл и разобраться в нем.
Использование автоматизации OLE применительно к Word и Excel проще, поскольку в эти программы встроена справка по VBA, содержащая описание всех объектов, свойств и методов.


Основные отличия при использовании автоматизации OLE от работы с серверами СОМ заключаются в следующем:

1)Для работы с серверами COM не обязательно чтобы приложение было запущено, но для этого необходимы определенные приготовления, которые требуют специфических знаний а так-же углубленного представления о работе технологии COM, как впрочем и в дальнейшем в процессе разработки.
Работа с серверами OLE требует от разработчика лишь возможность получить ссылку на COM-объект, запущенного приложения(OLE-сервер выдающий эту ссылку позиционирует себя как "Excel.Application")

2) В серверах автоматизации OLE при вызове методов не требуется задание значений необязательных параметров, что существенно упрощает многие операторы.
Параметры методов можно задавать в форматах "имя := значение", причем последовательность задания параметров безразлична. (по правилам VBA)
Это дополнительное удобство, так как не требуется помнить последовательность параметров в объявлении метода.

3) Еще одним преимуществом серверов автоматизации OLE является то, что вызываемые методы очень близки к их описанию в справке по VB соответствующей программы Microsoft Office. В серверах СОМ в некоторых случаях наблюдаются отличия.

4) Что касается OLE, то ряд условностей в реализации IDE, как и выбранного языка программисрования влияют так или иначе на наличие подсказок, возможность/невозможность использования констант с чем COM сервер чаще не имеет проблем. OLE-сервер как-бы сам отвечает за соответсвующющее приведения типов, когда при работе с COM-сервером предварительно приведение типов (обязательно).

Теперь следут сказать о том, что несмотря на простоту использования OLE-сервера, и множество тонкостей работы с COM-сервером, их вообще не следует сравнивать так, как используют их для разного рода задачь.
OLE-сервера всецело выполняют роль автоматизации конкретного запущенного приложения,
в то время как COM сервера реализуют саму идеологию COM и предоставляют возможность работать непосредственно с комполнентами, и не неуждаются в комбинорованном приложении, возможности COM более широки, а для большей ясности:
например широко применялась практика использования модулей MS Word "проверка орфографии" для проверки содержимого текстовых полей программ написанных на том-же C# или vb.NET, даже видел реализацию на Java (хотя там на этот счет есть более лаконичные решения). основана на взаимодействии с COM сервером, и для этого требуется только чтобы Word был установлен в системе - не запущен

Как-то так...



И все-таки в целом, как мне представляется, использовать серверы автоматизации OLE в большинстве случаев проще, чем работать с серверами СОМ.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
RUVATA
это конечно хорошо, но как-то уж общё. можно пример, как, к примеру, вызвать методы объекта того же Excel, в случае с COM и с OLE, просто я до этого времени искренне полагал что это одно и тоже, да и в вики как-то читал что COM - всего лишь концепция программирования, а OLE - конкретная ее реализация. но я не спец, и посему могу ошибаться. но вот пример все же интересно было бы глянуть.
и еще вспомнилось, про запущенные приложения и не запущенные.
Код:
ObjCreate('Excel.Application')

создаст новый процесс

Код:
ObjGet('Excel.Application'); или
ObjGet('filename')
перехватит существующий объект или если такового еще нет, создаст.

про это ли речь?
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Kaster, какие ты еще знаешь ЯП?
т.к. на AutoIt мне практически подключение к COM-серверу еще не доводилось делать
(э-т эксперимент еще предстоит поставить)... а вот на vb.NET или Java
наглядно мог бы показать, с C++ и С# у меня особые счеты.
...
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
RUVATA
С++, С#, Python
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
теперь окончательно стало ясно, что с COM-серверами, без обертки в OLE, AutoIt работать не может...
по причине отсутсвия в языке строгово привидения типов, в то время как интепритатор языка С-шный, и чисто теоретически мог-бы предоставить такой функционал...
Надеемся и ждем...
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
RUVATA [?]
стало ясно, что с COM-серверами, без обертки в OLE, AutoIt работать не может
RUVATA с чего вы это взяли?

COM ( Component Object Model - объектная модель компонентов )
OLE ( Object Linking and Embedding - технология связывания и внедрения объектов в другие документы и объекты )

На основе COM были реализованы технологии: Microsoft OLE Automation, ActiveX, DCOM, COM+, DirectX, а также XPCOM
 

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
http://autoit-script.ru/index.php?topic=2447.msg24499#msg24499
Я не буду настаивать... и разъяснять мне трудно так как я понимаю разницу на практике, но в терии сам плаваю...
Но я думаю, что найти информацию на руссском возможно, лично я разбирался по книге COM programming by example на "вражеском"... причем желательно бы иметь опыт программирования на языках более низкого уровня, в идеале на C++ или хотя-бы C# (хотя в последнем, опять-же фреймворк .NET скрывает от программиста внутренности COM-взаимодействия)

PS:
Garrett [?]
На основе COM были реализованы технологии: Microsoft OLE Automation, ActiveX, DCOM, COM+, DirectX, а также XPCOM
Википедия классная штука :smile: Но подключить AutoIt на "лысый" COM-сервер не помогает - "засада" начинается там где не просто необходимо использовать какой-то метод COM-сервера, а там где надо передавать аргументы функциям... тогда как вызывая DLL - строго определяем тип данных
н/п
Код:
$DLLshell = DllCall("MyLibrary.dll", "int", "ParseData", "ptr", DllStructGetPtr($Struct))

То после получения объекта COM, что бесспорно возможно... ну никак уже не определишь тип передаваемых аргументов... а COM этого требует, интерпритатор по неведомой мне логике сам назначает тип... и не всегда правильный.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
RUVATA [?]
А я и не скрываю! Википедия, по-моему, самый читаемый ресурс. :smile:

"засада" начинается там где не просто необходимо использовать какой-то метод COM-сервера, а там где надо передавать аргументы функциям
Пример, где это не получается, можете привести? Мене интересно стало! Не исключаю, что я и сам могу заблуждаться. Заинтриговали! :smile:
 

GDK

Новичок
Сообщения
8
Репутация
0
дело в значении объектWord.Application.ScreenUpdate = 0, выполнение объектWord.Application.ScreenUpdate = 1 решит проблемму.
.Application.ScreenUpdating = 1 (Word 2007).
Примеры для работы с таблицами (отрывки):
Код:
#include <Word.au3>

Func _OpenRepLossWd()
	$WordAppRep = _WordCreate(@ScriptDir & '\ReportLossForUserGN.doc')
	$WordRep = _worddocopen( $WordAppRep, @ScriptDir & '\ReportLossForUserGN.doc')
	
	$WordAppRep.Application.Visible = True
	
EndFunc

	;Очистка таблицы №1 вордовского файла со строки №2 до конца таблицы
	$WordRep.Application.ScreenUpdating = 0
	$k = $WordRep.tables(1).Rows.Count
	$Start = $WordRep.tables(1).cell(2,1).range.start
	$End = $WordRep.tables(1).cell($k,7).range.End
	$WordRep.range($Start, $End).delete
	$WordRep.Application.ScreenUpdating = 1

	; Внести в ячейку (строка 2, столбец 1) текст "Fire"
	$WordRep.tables(1).cell(2,1).range.text = "Fire"
 

Bingo888

Новичок
Сообщения
36
Репутация
0
Добрый день! Такой вопрос а если нужно абзац текста отредактировать через rang это можно сделать?
Пробовал такими командами:
Код:
$MyRange = $oDoc.Range(0,0)
$Start = $oDoc.ActiveWindow.Panes(1).Pages(1).Breaks(1).Range.Start
$End = $oDoc.ActiveWindow.Panes(1).Pages(2).Breaks(1).Range.Start - 1

но почемуто в word 2003 не работает(
 
Последнее редактирование модератором:

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Данный фрагмент кода выделит в $MyRange всё содержимое ПЕРВОЙ страницы !
Код:
$MyRange = $oDoc.Range(0,0)
$Start = $oDoc.ActiveWindow.Panes(1).Pages(1).Breaks(1).Range.Start
$End = $oDoc.ActiveWindow.Panes(1).Pages(2).Breaks(1).Range.Start - 1
$MyRange = $oDoc.Range($Start,$End)
 

POMKA

Новичок
Сообщения
5
Репутация
0
Добрый день! Показалось что лучше всего здесь задать свои вопросы:
Пытаюсь создавать документы Ворд и в частности таблицы. И хочу таблицу расположить по центру. В ворде выделяешь таблицу и кнопкой сверху таблица посередине! Если выделить все ctrl+A то в таблице будут центрироваться данные в ячейках.
В коде аутоита выделяю таблицу, задаю центрировать по центру - и оппа, данные в ячейках центрируются. А если вручную кнопку жать (выделение осталось) то центрируется таблица. Магия!! как таблицу по центру расположить???
Код:
#include <Math.au3>
#include <String.au3>
#include <Array.au3>
#include <Word.au3>

$oWord = _Word_Create()       ; Создать Новый экземпляр Word
$oDoc =_Word_DocAdd($oWord)   ; Создать новый пустой Word документ
Const $WrdConst=2.835         ; Константа для отступов. Чтобы отступ был 1 мм нужно умножить на константу 2.835

With $oDoc.PageSetup
   .PaperSize = 7                    ; wdPaperA4
   .Orientation = $WdOrientLandscape ; широкая страница - непортретная :)
   .LeftMargin = 20*$WrdConst
   .RightMargin = 20*$WrdConst
   .TopMargin = 10*$WrdConst
   .BottomMargin = 1*$WrdConst
EndWith

Local $AAA[3][3] = [[1, 2, 3], ["a", "b", "c"], ["x", "y", "z"]]

Local $oRange = _Word_DocRangeSet($oDoc, -2) ; Установить курсор в Конец Word файла
_Word_DocTableWrite($oRange, $AAA)
$oDoc.Tables(1).Style = "Сетка таблицы"    ; Нарисовать сетку таблицы
$oDoc.Tables.Item(1).Columns(1).Width=8*$WrdConst   ; Ширина 1-го столбца 8 мм - место
$oDoc.Tables.Item(1).Columns(2).Width=53*$WrdConst  ; Ширина 2-го столбца 53 мм
$oDoc.Tables.Item(1).Columns(3).Width=23*$WrdConst  ; Ширина 3-го столбца 23 мм

$oDoc.Tables.Item(1).Select
$oWord.Application.Selection.ParagraphFormat.Alignment = 1 ; по центру форматирование
$oWord.Application.Selection.Paragraph.Alignment = 1 ; по центру форматировани

Сообщение автоматически объединено:

И второй вопрос у меня есть :smile:
В Ворде очень полезная фишка "Позиции табуляции". Просто чудесная!
Вижуал бейсик мне пишет:
Selection.ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(3.75), Alignment:=wdAlignTabCenter, Leader:=wdTabLeaderSpaces
А как это в аутоит засунуть? Сорь - не спец ни разу :(
Код:
#include <Math.au3>
#include <String.au3>
#include <Array.au3>
#include <Word.au3>

$oWord = _Word_Create()       ; Создать Новый экземпляр Word
$oDoc =_Word_DocAdd($oWord)   ; Создать новый пустой Word документ
$oDoc.PageSetup.Orientation = $WdOrientLandscape ; широкая страница - непортретная :)

$oDoc.Range.insertAfter ("Начало:" & @TAB & "666" & @TAB & @TAB & "ТУРНИРНАЯ ТАБЛИЦА" & @TAB & "Окончание:" & @TAB & "666" & @TAB & @CRLF)

$oDoc.Words(3).Font.Underline = 1
$oDoc.Words(4).Font.Underline = 1
$oDoc.Words(5).Font.Underline = 1
$oDoc.Words(12).Font.Underline = 1
$oDoc.Words(13).Font.Underline = 1
$oDoc.Words(14).Font.Underline = 1

$oDoc.Paragraphs(1).Range.Font.Size = 17

$oDoc.Application.Selection.Paragraphs(1).ParagraphFormat.TabStops.AddPosition = 10 ; чево здесь писать? Как?!?! Хелп!!
 
Верх