Ole как вставить в word

Библиографическое описание:


Рудниченко, А. К. Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ. Методы защиты от них / А. К. Рудниченко, С. О. Кошелев. — Текст : непосредственный // Молодой ученый. — 2016. — № 29 (133). — С. 36-38. — URL: https://moluch.ru/archive/133/37122/ (дата обращения: 14.04.2023).



В данной статье рассказывается, что такое OLE интерфейс, его простейшее применение. Также рассматривается, как с помощью него распространяются вредоносные программы в виде документов Microsoft Word на различные предприятия. Предлагается список мер, которые помогут уменьшить риск получения заражённого файла на компьютеры организации.

Ключевые слова: Microsoft Office, Word, OLE интерфейс, OLE объекты, информационная безопасность, вредоносные программы

В настоящее время в мире существует множество программ, разработчики которых относят свои продукты к разряду офисных. Наибольшую популярность набрал Microsoft Office. Самым массовым продуктом из этого набора является Microsoft Word. Им пользуются практически все как на домашних компьютерах, так и на компьютерах на предприятиях.

Microsoft Word (MS Word) — многофункциональная система обработки текстов, обладающая полным набором средств, необходимых для быстрого создания и эффективной обработки документов практически любой степени сложности. Но на редактировании текста его функционал не ограничивается. Расширяются возможности офисных программ семейства Microsoft с помощью различных дополнений, таких как Visual Basic для приложений, OLE объекты, ActiveX объекты и другие. Таким образом, MS Word — не только текстовый редактор, а ещё средство для выполнения самых разных алгоритмов, написанных на Visual Basic или запуска и связывания с документом различных программ.

Интерфейс OLE (Object Linking and Embedding — связывание и внедрение объектов) поддерживается множеством различных программ и используется для помещения документа, созданного в одной программе, в другую программу. Например, можно вставить документ MS Word в книгу MS Excel. Задача интерфейса OLE проста — создание промежуточного звена между программами для упрощения работы с различным программным обеспечением, поэтому OLE чаще всего используется тогда, когда обрабатываются составные документы с различными между собой системами. В данный момент OLE интерфейс используется в виде OLE объектов, которые зачастую представляют собой различные мультимедийные данные.

Алгоритм вставки объекта, который содержит ссылку на содержимое из другой программы очень прост:

  1. Открыть MS Word и определить место, где будет помещён OLE объект;
  2. На вкладке «Вставка» в группе «Текст» щёлкнуть «Объект»;
  3. Открыть вкладку «Создание из файла»;
  4. В поле «Имя файла» ввести имя файла или нажать кнопку «Обзор» для выбора файла из списка.

Существует два режима вставки объектов:

– Без связи с исходным файлом. Вставка содержимого указанного файла в документ происходит так, чтобы его можно было редактировать, используя приложение, в котором он был создан. Изменения в исходном файле не отображаются в OLE объекте, который вставлен в документ. Для этого имеется функция редактирования OLE объекта.

– Со связью с исходным файлом. Вставка содержимого файла в документ и создание связи с источником. Изменения в исходном файле будут автоматически отображаться в документе. Редактирование происходит в исходном документе.

В качестве OLE объекта может быть вставлен не только документ из линейки продукта Microsoft Office. Например, возможно вставить ссылку на простейший текстовый документ, изображение или PDF-документ. Особое внимание стоит уделить тому, что функционал OLE интерфейса позволяет вставлять таким же образом и исполняемые файлы, которые могут нанести вред операционной системе или отдельным файлам.

Таким образом, OLE объект и сам документ, созданный в Microsoft Word, может содержать в себе вредоносный код, который не будет детектироваться антивирусным программным обеспечением. Отсутствие каких-либо замечаний со стороны защищающих программ обуславливается тем, что вредоносный код создан полностью легальными средствами, а также потому что конечным результатом является документ формата «*.doс» или «*.docx» соответственно.

Вредоносный код, содержащийся в OLE объекте, выполняется не сразу. Для запуска исполняемого файла из документа MS Word необходимо кликнуть два раза по вставленному объекту. На данном этапе злоумышленники пытаются доказать жертве отсутствие подозрительного контента: рисунок стандартного объекта заменяется на изображение какой-либо таблицы, а над ней пишется просьба о том, что необходимо кликнуть на таблицу дважды (например, «Для просмотра таблицы кликните дважды на таблицу»). Для запуска исполняемого файла пользователь должен согласиться с запуском в вполне стандартном окне запуска. Пример вредоносного документа с OLE объектом представлен на рисунке 1.

Рис. 1. Демонстрация вредоносного документа с OLE объектом

Для убедительности такие документы с вредоносным кодом посылаются по электронной почте под видом письма от государственных органов (например, налоговой службы) с помощью замены заголовка письма. Таким образом, сотрудник, открывающий письмо, не видит настоящего адреса отправителя. Он замаскирован (например, под noreply@nalog.ru), и визуально определить, настоящий это адрес или изменённый заголовок, зачастую невозможно.

В рамках любого предприятия неосведомлённые сотрудники могут пропустить предупреждение об открытии исполнительного файла, так как оно выглядит стандартно и пользователем нарочно пропускается в силу привычного интерфейса окна. Формату Microsoft Word чаще всего доверяют и не подозревают от него никакой вредоносной активности, что «играет на руку» злоумышленникам. Исходя из этого, шанс того, что сотрудник организации откроет документ и осуществит запуск вредоносного программного обеспечения, достаточно велик.

Безусловно, в интересах организации обезопасить компьютеры сотрудников. Для того, чтобы уменьшить (или вовсе исключить) риск заражения от данного способа распространения вредоносных программ предлагаются следующие меры:

– Использование аппаратных или программных средств защиты для фильтрации трафика электронной почты. Таким образом, письма с изменёнными заголовками будут отсеиваться или помечаться статусом «Подозрительно»;

– Своевременное и регулярное обучение сотрудников организации, а также их информирование о сценариях заражения, так как распространение вредоносных документов допустимо и без использования электронной почты;

– Использование относительно новой версии пакета Microsoft Office (2010 и выше). Последние версии данного продукта имеют в своём функционале «Защищённый просмотр», что уменьшает шанс того, что сотрудник откроет OLE объект. «Безопасный режим» позволяет открывать файлы и просматривать их в более безопасной среде (без использования макросов и дополнительных объектов).

Таким образом, стандартные легитимные средства редактирования документов могут служить распространителями различных программ без ведома пользователей. OLE объекты — это относительно новая ветвь развития в сфере вредоносных программ для предприятий. В конце 2016 года в адрес некоторых организаций уже начинают поступать такие документы, так как они отлично подходят для «доставки» вирусов-шифровальщиков или других вредоносных программ на компьютер жертвы руками обычных пользователей. А отследить, откуда пришло письмо с загадочным документом, зачастую не предоставляется возможным.

Литература:

1. Object Linking and Embedding // Википедия — URL: https://ru.wikipedia.org/wiki/Object_Linking_and_Embedding

2. Создание и изменение объектов OLE и управление ими // MicrosoftSupport — URL: https://support.office.com/ru-ru/article/Создание-и-изменение-объектов-OLE-и-управление-ими-e73867b2–2988–4116–8d85-f5769ea435ba

3. ActiveX // Википедия — URL: https://ru.wikipedia.org/wiki/ActiveX

4. Технология MicrosoftOLE используется для внедрения вредоносного кода в документы // Журнал «Хакер» — URL: https://xakep.ru/2016/06/16/microsoft-ole-for-malware/

Основные термины (генерируются автоматически): OLE, вредоносный код, документ, исходный файл, программа, электронная почта, вредоносный документ, запуск, интерфейс, исполняемый файл.

Ключевые слова

Информационная безопасность,

вредоносные программы,

Microsoft Office,

слово,

OLE интерфейс,

OLE объекты,

Word

Microsoft Office, Word, OLE интерфейс, OLE объекты, информационная безопасность, вредоносные программы

Похожие статьи

Современные системы автоматизированного динамического…

Модель взаимодействия с системами автоматизированного динамического анализа вредоносных программ. Метод автоматизированного анализа электронных документов в формате XML. Современные технологии обнаружения и уничтожения вредоносных программ.

Методика исследования вредоносных программ

Далее, запускается образец вредоносной программы. По прошествии некоторого времени (приблизительно несколько минут) завершаем работу ProcessMonitor и сохраняем получившийся в результате файл.

Электронная почта.

Вредоносные программы, блокирующие работу с операционной…

– копирование файла вредоносной программы в системную папку

вредоносная программа, вирус, Windows, троянский, Уинлок, выкуп, Экран блокировки, винлокер.

Задать вопрос. ФИО. Электронная почта.

Актуальные способы внедрения компьютерных вирусов

Ключевые слова: вирус, вредоносная программа, информационная система, компьютер, юникод, RLO, джойнер.

Таким образом, в архив добавляются два исполняемых файла и запаковываются.

Использование криптографии с временным раскрытием для…

Если зашифровать вредоносный код, то метод сигнатурного анализа станет неприменим для его обнаружения.

Запускает записанный на шаге 3файл.

Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ.

Защита информации в сети | Статья в журнале «Молодой ученый»

Рассмотрим термин, вирус — это компьютерная программа или вредоносный код, отличительным

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

Выявление компонентов операционной системы, требующих…

Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ. Методы защиты от них. Анализ методов обнаружения вредоносных программ.

Автоматизированное добавление печатных штампов при помощи…

Программа позволяет создавать собственные документы, формы, презентации и многое другое.

Основные термины (генерируются автоматически): PDF, API, IAC, документ, VBA, OLE, обработанный PDF-документа, нижний колонтитул

Электронная почта. Ваш вопрос.

Современные системы автоматизированного динамического…

Модель взаимодействия с системами автоматизированного динамического анализа вредоносных программ. Метод автоматизированного анализа электронных документов в формате XML. Современные технологии обнаружения и уничтожения вредоносных программ.

Методика исследования вредоносных программ

Далее, запускается образец вредоносной программы. По прошествии некоторого времени (приблизительно несколько минут) завершаем работу ProcessMonitor и сохраняем получившийся в результате файл.

Электронная почта.

Вредоносные программы, блокирующие работу с операционной…

– копирование файла вредоносной программы в системную папку

вредоносная программа, вирус, Windows, троянский, Уинлок, выкуп, Экран блокировки, винлокер.

Задать вопрос. ФИО. Электронная почта.

Актуальные способы внедрения компьютерных вирусов

Ключевые слова: вирус, вредоносная программа, информационная система, компьютер, юникод, RLO, джойнер.

Таким образом, в архив добавляются два исполняемых файла и запаковываются.

Использование криптографии с временным раскрытием для…

Если зашифровать вредоносный код, то метод сигнатурного анализа станет неприменим для его обнаружения.

Запускает записанный на шаге 3файл.

Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ.

Защита информации в сети | Статья в журнале «Молодой ученый»

Рассмотрим термин, вирус — это компьютерная программа или вредоносный код, отличительным

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

Выявление компонентов операционной системы, требующих…

Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ. Методы защиты от них. Анализ методов обнаружения вредоносных программ.

Автоматизированное добавление печатных штампов при помощи…

Программа позволяет создавать собственные документы, формы, презентации и многое другое.

Основные термины (генерируются автоматически): PDF, API, IAC, документ, VBA, OLE, обработанный PDF-документа, нижний колонтитул

Электронная почта. Ваш вопрос.

Похожие статьи

Современные системы автоматизированного динамического…

Модель взаимодействия с системами автоматизированного динамического анализа вредоносных программ. Метод автоматизированного анализа электронных документов в формате XML. Современные технологии обнаружения и уничтожения вредоносных программ.

Методика исследования вредоносных программ

Далее, запускается образец вредоносной программы. По прошествии некоторого времени (приблизительно несколько минут) завершаем работу ProcessMonitor и сохраняем получившийся в результате файл.

Электронная почта.

Вредоносные программы, блокирующие работу с операционной…

– копирование файла вредоносной программы в системную папку

вредоносная программа, вирус, Windows, троянский, Уинлок, выкуп, Экран блокировки, винлокер.

Задать вопрос. ФИО. Электронная почта.

Актуальные способы внедрения компьютерных вирусов

Ключевые слова: вирус, вредоносная программа, информационная система, компьютер, юникод, RLO, джойнер.

Таким образом, в архив добавляются два исполняемых файла и запаковываются.

Использование криптографии с временным раскрытием для…

Если зашифровать вредоносный код, то метод сигнатурного анализа станет неприменим для его обнаружения.

Запускает записанный на шаге 3файл.

Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ.

Защита информации в сети | Статья в журнале «Молодой ученый»

Рассмотрим термин, вирус — это компьютерная программа или вредоносный код, отличительным

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

Выявление компонентов операционной системы, требующих…

Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ. Методы защиты от них. Анализ методов обнаружения вредоносных программ.

Автоматизированное добавление печатных штампов при помощи…

Программа позволяет создавать собственные документы, формы, презентации и многое другое.

Основные термины (генерируются автоматически): PDF, API, IAC, документ, VBA, OLE, обработанный PDF-документа, нижний колонтитул

Электронная почта. Ваш вопрос.

Современные системы автоматизированного динамического…

Модель взаимодействия с системами автоматизированного динамического анализа вредоносных программ. Метод автоматизированного анализа электронных документов в формате XML. Современные технологии обнаружения и уничтожения вредоносных программ.

Методика исследования вредоносных программ

Далее, запускается образец вредоносной программы. По прошествии некоторого времени (приблизительно несколько минут) завершаем работу ProcessMonitor и сохраняем получившийся в результате файл.

Электронная почта.

Вредоносные программы, блокирующие работу с операционной…

– копирование файла вредоносной программы в системную папку

вредоносная программа, вирус, Windows, троянский, Уинлок, выкуп, Экран блокировки, винлокер.

Задать вопрос. ФИО. Электронная почта.

Актуальные способы внедрения компьютерных вирусов

Ключевые слова: вирус, вредоносная программа, информационная система, компьютер, юникод, RLO, джойнер.

Таким образом, в архив добавляются два исполняемых файла и запаковываются.

Использование криптографии с временным раскрытием для…

Если зашифровать вредоносный код, то метод сигнатурного анализа станет неприменим для его обнаружения.

Запускает записанный на шаге 3файл.

Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ.

Защита информации в сети | Статья в журнале «Молодой ученый»

Рассмотрим термин, вирус — это компьютерная программа или вредоносный код, отличительным

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

Выявление компонентов операционной системы, требующих…

Использование OLE-объектов в документах Microsoft Word как средство распространения вредоносных программ. Методы защиты от них. Анализ методов обнаружения вредоносных программ.

Автоматизированное добавление печатных штампов при помощи…

Программа позволяет создавать собственные документы, формы, презентации и многое другое.

Основные термины (генерируются автоматически): PDF, API, IAC, документ, VBA, OLE, обработанный PDF-документа, нижний колонтитул

Электронная почта. Ваш вопрос.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

В одной из статей, посвященных работе с Excel в Delphi читатель с ником Kanti задал весьма не тривиальную задачку — как добраться до диаграммы Excel, внедренной в документ Word и работать с ней. За что Kanti большое человеческое спасибо — приятно, когда читатели интересуются жизнью блога и предлагают новые темы и идеи.
На первый взгляд задача довольно не простая. Однако решение для неё есть. Я пошел немного дальше в решении проблемы и сегодня расскажу вам:

  • как работать с объектом Excel, внедренном в документ Word
  • как работать с документом Word, внедренным в Excel.

План статьи:

  • Азы работы с MS Word в Delphi
  • Как работать с объектом Excel, внедренном в документ Word
  • Как работать с документом Word, внедренным в Excel

Прежде, чем начать изложение основного материала, следует упомянуть некоторые моменты работы с Word, т.к. в блоге я их не касался, но эти основы пригодятся для освоения основного материала статьи.

1. Азы работы с MS Word в Delphi

Запуск MS Word в принципе ни чем не отличается от запуска MS Excel за одним небольшим исключением — меняется параметр функции CreateOLEObject:

MyWord:=CreateOleObject('Word.Application');

Но, чтобы не повторяться дважды я расскажу ещё один дополнительный момент, который Вам пригодиться для дальнейшей работы: как подключиться к уже выполняющемуся приложению MS Office, чтобы не создавать лишних копий процессов.

Для того, чтобы подключиться к уже запущенному приложению достаточно использовать функцию GetActiveOleObject, единственным параметром которой является имя класса. Например, чтобы подключиться к запущенному приложению MS Word необходмо выполнить:

MyExcel:=GetActiveOleObject('Word.Application')

Соответственно, чтобы не гадать запущена или не запущена та или иная программа пакета MS Office достаточно воспользоваться связкой двух функций:

try
  MyWord:=GetActiveOleObject('WordApplication');
except
  MyWord:=CreateOleObject('Word.Application');
end;

Для того, чтобы открыть уже имеющийся документ Word необходимо воспользоваться методом Open объекта Documents, например так:

MyWord.Documents.Open('myword.doc');

После того как документ открыт, Вы можете его редактировать, изменять текст, параметры страницы и т.д., но сегодня нам это не важно. Главное сегодня — научиться работать с объектами. И с этого момента начинается решение первой задачи.

2. Как работать с объектом Excel, внедренном в документ Word

Каждый документ Word имеет коллекцию Shapes, которая позволяет добавлять в документ объекты, созданные и отображаемые с помощью программ-серверов OLE (OLE-серверов). OLE-объекты в документах Word могут отображаться также, как они отображаются в приложениях, предназначенных для их создания и редактирования. Все наверно пользовались редактором формул Math Type? Вот вам простой OLE-сервер. Добавляете OLE-объект формулы  в документ — открывается окно Math Type где вы вводите то, что хотите увидеть и потом формула отображается в документе Word.

Другое дело, когда Вы пробуете вставить в документ Word, например файл mp3. В этом случае объект будет отображен в документе в виде ярлыка, но, тем не менее будет внесен в коллекцию Shapes и до него можно будет добраться из Delphi.

insert_objectТеперь попробуем посмотреть как выглядит добавление OLE-объектов. В простейшем случае Вы открываете Word, создаете документ и выбираете «Правка — Вставить — Объект» и перед Вами открывается окно с перечнем всех OLE-объектов, которые Вы можете использовать в документе. Выбираете объект, вставляете в документ — работаете. Обратите внимание на рисунок — в окне на рисунке как раз отображены всевозможные объекты нашего с Вами исследования.

Для того, чтобы вставить OLE-объект в документ Word из Delphi необходимо воспользоваться методом AddOleObject коллекции Shapes, который имеет следующий вид:

Shapes.AddOleObject(ClassType, FileName, LinkToFile, DisplayAsIcon, IconFileName, IconIndex, IconLabel, Range)

ClassType — имя, используемое для включения указанного объекта OLE. Например, чтобы вставить в документ Word диаграмму Excel следует использовать

для добавления листа Excel, соответственно:

и так далее. В принципе ничего сложного нет — вставить можно, что угодно, хоть exe-файл :)

FileName — имя файла, из которого должен быть создан объект. Если этот аргумент опущен, то используется текущая папка. Вы должны указать либо ClassType либо  FileName, но никак не одновременно оба параметра.

LinkToFile True для того, чтобы связать OLE-объект с файлом, из которого он был создан. False, чтобы сделать объект OLE-объект независимым от копии файла, т.е. включить объект в документ Word. Если Вы определили значение для ClassType, аргумент LinkToFile должны быть ложными. Значение по умолчанию False.

DisplayAsIcon True для отображения объекта OLE в виде значка. Значение по умолчанию False.

IconFileName — Файл, который содержит значок для отображения объекта OLE.

IconIndex -индекс иконки отображения из IconFileName. Значение по умолчанию — ноль.

IconLabel — подпись к иконке объекта.

Range — диапазон,  где объект OLE будет размещен в тексте. Объект OLE заменяет выбранный диапазон. Если этот аргумент опущен, объект вставляется автоматически (в текущую позицию курсора в документе).

Давайте теперь продемонстрируем использование этого метода на практике и, заодно, приготовим плацдарм для дальнейшей работы. Рассмотрим как можно вставить чистый лист Excel в документ Word. Причем вставим лист в нужные нам координаты и зададим ему (листу) длину и ширину:

var MyWord: OLEVariant;
  begin
    MyWord:=CreateOleObject('Word.Application');  
    MyWord.Visible:=true;
    MyWord.Documents.Open(doc);
    MyWord.ActiveDocument.Shapes.AddOLEObject(ClassType:='Excel.Sheet',Left:=10, Top:=10, Width:=400, Height:=300);
  end;

Как видите, вместо того, чтобы указать объект Range мы просто расписали его параметры Left, Top, Width и Height. После выполнения этих операций в документе doc аккурат в верху страницы вставиться лист Excel.

Теперь, когда лист вставлен, можно приступать к дальнейшему изучению «глубин» OLE-серверов Microsoft.

Создадим новую переменную, в которой будем хранить ссылку на OLE-объект.

и сразу получим ссылку на наш лист Excel в Word’е:

MyOLE:=MyWord.ActiveDocument.Shapes.Item(1);

Так будет проще разбираться и избавит нас от лишней писанины.

Представим себе, что мы ничего абсолютно не знаем про то, что лежит в MyOLE. Знаем только то, что это элемент из коллекции Shapes и все. Как определить, что мы получили ссылку именно на объект Excel, а не на автофигуру или, ещё хуже, не на файл mp3?

Для того, чтобы получить всю необходимую информацию об OLE-объекте достаточно обратиться к объекту MS Word под названием OLEFormat.

OLEFormat имеет следующие свойства:

Свойство Описание
Application Возвращает имя приложения к которому относится объект. В нашем случае вернет «Microsoft Word»
ClassType Возвращает или устанавливает тип класса для указанного объекта OLE, фотографии или поля.
Creator Возвращает 32-битное целое число, которое указывает на приложение в котором был создан объект.
DisplayAsIcon True, если указанный объект отображается в виде значка. Свойство для чтения/записи
IconIndex Возвращает или устанавливает индекс иконки, используемой если DisplayAsIcon True.
IconLabel Возвращает или устанавливает подпись к иконке OLE-объекта.
IconName Возвращает или устанавливает файл программы, в которой хранится икона для объекта OLE.
IconPath Возвращает путь к файлу, в котором хранится иконка для объекта OLE
Label Возвращает строку, которая используется, чтобы определить часть исходного файла для связывания объектов
Object Возвращает объект, который представляет собой объект верхнего уровня интерфейса указанного объекта OLE
Parent Возвращает объект, который представляет собой родительский объект указанного объекта OLEFormat
ProgID Возвращает программный идентификатор (ProgID) для указанного объекта OLE.

Теперь, используя эти свойства, попробуем получить всю необходимую нам информацию об OLE-объекте.

Вызовем последовательно свойства ClassType и ProgID:

ShowMessage(MyOle.OLEFormat.ClassType);
ShowMessage(MyOle.OLEFormat.ProgID);

В моем случае, результатом выполнения операций были две одинаковых строки «Excel.Sheet.12» Так как у меня установлен Office 2007 то версия 12, что и отразилось в сообщениях. У Вас это могут быть 10, 11 или как у меня 12 версии. С помощью номера версии можно будет определять — возможно ли в принципе изменять такие объекты на машине пользователя или нет.

Идем дальше. Итак, мы определили, что объект представляет собой лист Excel. Как получить доступ к Excel? И причем сделать это так, чтобы можно было наш OLE-объект изменить?

Обратимся к свойству Object. Согласно описанию, свойство должно вернуть нам ссылку на объект верхнего уровня. Следовательно, применительно к нашей ситуации — это будет ссылка на объект Excel. Чтобы убедиться в сказанном, сделаем так:

ShowMessage(MyOle.OLEFormat.Object.Application.Name);

то есть получим имя приложения в котором был создан объект. В результате получим сообщение в виде строки «Microsoft Excel«.

Ну, а теперь развязка вопроса — используя ссылку на Excel попробуем написать что-нибудь на листе, например, избитую фразу «Hello World!»:

MyOle.OLEFormat.Object.Application.ActiveSheet.Range['A1'].Value:='Hello World!';

Можете проверить — в ячейку А1 запишется строка. Здесь следует обратить внимание на то, что при записи в Excel мы не использовали свойства ActiveWorkBook, которое обычно предшествует свойству ActiveSheet. Все дело в том, что среди объектов OLE Office нет такого OLE-объекта — вставляется только лист либо диаграмма. По сути диаграмма — это два листа Sheet где на одном находится сам график, а на втором — данные к нему.

Вот таким простым и достаточно понятным способом можно добавлять, изменять и удалять OLE-объекты. Кстати, на досуге можете потренироваться вставлять, активировать, редактировать сразу несколько различных OLE-объектов — принцип работы тот же. Получаете Object и используете его функции.

3. Как работать с документом Word, внедренным в Excel.

Надо сказать, что разработчики в Microsoft весьма неплохо потрудились, чтобы запутать бедных разработчиков :).  В начале все просто — как в Word. Есть Shapes у которого в свою очередь есть метод AddOLEObject, с практически теме же параметрами.

Далее, по логике вещей, у Shapes должно быть свойство-объект OLEFormat. Проверяем — действительно есть, но…свойства другие, точнее одно из свойств другое, а большинства вообще нет. Но, мы люди не гордые — будем управляться с тем, что есть:

Свойство Описание
Application При использовании без классификатора объектов, это свойство возвращает объект приложения, представляющий приложение Microsoft Excel.
При использовании с объектом Qualifier, это свойство возвращает объект приложения, которое использовалось для создания объекта
Object Возвращает OLE Automation объект ассоциированный с OLE объектом
Parent Возвращает объект, который представляет собой родительский объект указанного объекта OLEFormat
progID Возвращает программный идентификатор (ProgID) для указанного объекта OLE.

Как видите свойств не много. Главное, что осталось свойство Object — вот его мы и попробуем использовать в своих корыстных целях.

За что следует, наверное, сказать спасибо разработчикам Excel, так это за то, что они предусмотрели сразу объект OLEObjects предоставляющий нам в распоряжение все OLE-объекты листа. Используя этот объект мы минуем использование Shapes. Например так:

MyExcel.ActiveWorkBook.ActiveWorkSheet.OLEObjects.Count

Мы получаем число OLE-объектов документа.

MyExcel.ActiveWorkBook.ActiveWorkSheet.OLEObjects(1)

соответственно даст доступ к первому из OLE-объектов документа, а уж с ним-то нам и предстоит работать. Итак, рассмотрим следующую задачку: необходимо вставить в документ Excel пустой документ Word и написать в нем любую строку.

Чтобы не повторяться в применениях метода — вставим в Excel уже готовый документ Word из файла:

...
 
MyExcel.ActiveWorkBook.ActiveSheet.OLEObjects.Add(FileName:=doc, Left:=10, Top:=10, Width:=300, Height:=300);
MyOLE:=MyExcel.ActiveWorkBook.ActiveSheet.OLEObjects.item(1);
MyOLE.Activate;
ShowMessage(MyOle.ProgID); //убедимся, что объект относится к Word
ShowMessage(MyOle.Object.Application.Name); //запросим имя приложения
MyOle.Object.Application.ActiveDocument.Range.InsertAfter('Привет');
....

Обратите внимание, в данном случае мы использовали для работы с OLE-объектом не Shapes, а OLEObjects. Попробуйте воспроизвести те же самые действия как в случае работы с Excel из Word, т.е. воспользоваться свойством Object у объекта ObjectFormat. Думаю Вы будите «приятно» удивлены, т.к. в результате запроса имени приложения Вам вернется не Word как ожидалось, а Excel — следовательно работать с OLE-объектом становится невозможно.

Также следует отметить, что прежде, чем приступать к редактированию OLE-объекта, следует его предварительно активировать.

Вот так можно работать с Excel из Word и с Word из Excel и при этом не выходить из Delphi :). Ну, а для чего это использовать — решать Вам. Я только показал Вам возможности работы в Delphi с программами Word и Excel.

Книжная полка

Название:Разработка приложений Microsoft Office 2007 в Delphi

Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

купить книгу delphi на ЛитРес

0
0
голоса

Рейтинг статьи

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

Я работаю на компьютерах последние 10 лет и впервые столкнулся с этой ошибкой — Microsoft Word ожидает завершения действия OLE. Попробовав несколько вариантов, я, наконец, смог избавиться от этой ошибки и поэтому решил написать этот пост и рассказать вам, что сработало для меня.

Microsoft Word ожидает завершения действия OLE

Прежде чем мы приступим к исправлению этой ошибки, давайте узнаем, что означает действие OLE и почему возникает эта ошибка.

Что такое действие OLE?

OLE — это сокращение от Object Linking & Embedding. Действие OLE — это механизм, специально разработанный Microsoft, чтобы помочь приложениям MS Office, таким как MS Word, Excel и Powerpoint, обмениваться данными и связываться с другими приложениями.

Почему вы получаете ошибку OLE в Word?

Ошибка OLE возникает в MS Word, когда приложение пытается получить данные из другого приложения. Я получил эту ошибку, когда пытался вставить объект — мою электронную таблицу Excel в MS Word. Я не смог этого сделать, потому что Word показывал ошибку: Microsoft Word ожидает завершения действия OLE. Я нажимал «Повторить» несколько раз, но это не сработало. Так что технически MS Word не смог получить данные из моего листа Excel, поэтому я получил эту ошибку.

Эти предложения обязательно помогут вам исправить ошибку Microsoft Word ожидает завершения действия OLE на вашем компьютере с Windows:

  1. Переключиться и повторить попытку
  2. Закройте другие приложения
  3. Отключить надстройки Word
  4. Переключиться на математический тип
  5. Перезагрузите компьютер

1]Кнопка «Переключиться и повторить попытку»

Я работал над документом Word и хотел вставить файл excel. Я использовал «Вставить объект» на ленте главного меню и, подождав почти минуту, получил эту ошибку.

Я попытался нажать кнопку «Переключиться на», но это ничего не дало, как и кнопка «Повторить». Я нажал кнопку «Отмена», и окно с ошибкой исчезло. Попробовал снова вставить объект, но снова получил ту же ошибку.

Я также принудительно закрывал MS Word 2-3 раза через диспетчер задач и пытался снова, но ничего не работало.

2]Закройте другие приложения

Я получил эту ошибку OLE при попытке вставить файл Excel, но вы получаете ее и с другими приложениями. Когда вы получаете эту ошибку, нажмите клавиши Alt + Tab на клавиатуре и проверьте, какие другие приложения Office открыты. Закройте их. Если вы не можете закрыть их вручную или ваш курсор застрял, нажмите Ctrl+Alt+Delete, чтобы открыть диспетчер задач и закрыть другие приложения Office. В моем случае файл excel, который я пытался вставить, был открыт. Я закрыл файл excel, и ошибка исчезла.

3]Отключить надстройки Word

Ну, не в моем случае, но слишком много надстроек, установленных в Word, также могут привести к этой ошибке, о чем сообщают многие пользователи в Интернете. Если вышеупомянутые исправления не работают для вас, попробуйте отключить нежелательные надстройки из вашего MS Word. Чтобы отключить надстройки Word–

  • Откройте MS Word, перейдите на вкладку «Файл» и выберите «Параметры».
  • Перейти к надстройкам.
  • Перейдите на вкладку «Управление» в нижней части окна и нажмите кнопку «Перейти».
  • Откроется диалоговое окно, в котором вы можете выбрать надстройки, которые хотите отключить.
  • Просто снимите флажок напротив надстройки, которую вы хотите отключить.
  • Нажмите OK, и все готово.

4]Переключиться на математический тип

Если вы получаете сообщение об ошибке, Microsoft Word ожидает завершения действия OLE при работе с Mathtype. Переключитесь на Mathtype и закройте диалоговое окно. Опять же, если Переключить на кнопка не работает для вас, вы можете использовать сочетание клавиш Alt + Tab, чтобы закрыть ее.

5]Перезагрузите компьютер

Это то, что может исправить практически любую временную ошибку. Если вы по-прежнему получаете сообщение об ошибке действия OLE в MS Word и больше ничего не работает, перезагрузите компьютер и повторите попытку. Это, скорее всего, должно исправить эту ошибку.

Чтение: Microsoft Excel ожидает, пока другое приложение выполнит действие OLE

Что такое действие OLE в MS Word?

Связывание и внедрение объектов, сокращенно OLE, — это метод, специально разработанный Microsoft, чтобы помочь приложениям Office успешно взаимодействовать с другими приложениями.

Как исправить ошибку действия OLE в Excel?

Откройте лист Excel > Файл > Опция > вкладка Дополнительно. Прокрутите вниз до области «Общие» и установите флажок «Игнорировать другие приложения, использующие динамический обмен данными (DDE)». Перезапустите Эксель.

Microsoft Word ожидает завершения действия OLE



Работа с OLE-сервером Word.

Аналогично как и в части 1 — поставим целью из приложения (контроллера
автоматизации) создать документ изображенный на Рис 2.1. Он также типичен с
точки зрения созданя прикладных программ, использующих для вывода информации
Word и содержит три наиболее часто используемых составных элемента: текстовую
информацию, таблицу и диаграмму.

Путь создания данного документа — это шаги, которые позволят освоить работу
с OLE сервером Word.

ole_2_1.jpg

Рис 2.1 Итоговый документ, сформированный контроллером.

В начало

2.1 Получение доступа к интерфейсу Application для Word.

  • 1. Включить в проект модули:

    #include      <ComObj.hpp>
    #include      <utilcls.h>
    
  • 2. Определить — лучше глобально (для наглядности и удобства) —
    переменные, отражающие иерархию объектов Word
    Приложение->Набор документов->документ->Набор парагрофов->
    Параграф->Строки

    Variant  vVarApp,vVarDocs,vVarParagraphs,vVarParagraph;
    ///////
  • 3. создать объект автоматизации:

    vVarApp=CreateOleObject("Word.Application");
    

    Также, по причине описанной ввыше (Ч 1. П 1.1), не будем ориентироваться
    на конкретную библиотеку *.olb Office (конструкцию типа Word.Application.8 или
    Excel.Application.9, как и имена констант использовать не будем).

С этого момента можно пользоваться свойствами и методами созданного ole
сервера, а именно:

  • Установка свойства.

    vVarApp.OlePropertySet("имя", значение);  
    
  • Чтение значения свойства.

    переменная = app.OlePropertyGet("имя"); 
    
  • Вызов метода:

    vVarApp.OleProcedure("имя",список параметров метода);
    

В начало

2.2 Интерфейсы и константы

Список интерфейсов и констант получаем при просмотре библиотеки типов
Microsoft Word Object Library, открыв например файл MSWord9.olb (или
другой в зависимости от версии Microsoft Offise). О пользовании библиотекой
см. Ч 1. P 1.2.

Аналогично будем пользоваться сохраненным файлом MSWord9.idl
и использовать так называемый «хитрый метод«.

Напомним его суть — перевод макроса из кода Visual Basic в С++ код.
Использование его аналогично как и при разработке контроллера для
управления сервером Excel:

  • 1. Запустить Word.

  • 2. Сервис/Maкрос/Начать запись

  • 3. Выполннить последовательность нужных действий.

  • 4. Остановить запись

  • 5. Вызвать Visual Basic (Alt+F11)

  • 6. Tools/Macros/Edit

  • 7. Перевести код из кода Visual Basic в С++.

В начало

2.3 Создание рабочего документа

Создаем новое приложение (File/New/Application) и сохраним его файлы в
директории по умолчанию (Projects) c именами по умолчанию Unit1.cpp, Unit1.h,
Unit1.dfm, Project1.cpp, Project1.bpr. Имена на данном этапе не цель, хотя не
возбраняется создать новую директорию и дать приложению и файлам подходящие
имена.

Переменные соответствующие используемым в программе объектам, а именно:

Variant  vVarApp,vVarDocs,vVarParagraphs,vVarParagraph;
bool fStart;

определим сразу все и глобально или в файле Unit1.h (в разделе private:) или
перед функциями в Unit1.cpp, хотя для данного этапа требуются пока не все переменные
и можно определить нужные и локально.

Переменная fStart служит индикатором того, что сервер запущен.

Разместим на форме как и ранее три кнопки (из вкладки Standart компонент
Button). Подписывать кнопки также не будем (сейчас это тоже не цель), но
запомним, что по первой кнопке будем работать с таблицей, по второй с
диаграммой, а по третьей закрывать сервер и приложение. Выполним два клика
по Button1 и Button3, создаем таким образом обработчики события нажатия кнопки.

void __fastcall TForm1::Button1Click(TObject *Sender)
{

}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 if(fStart) vVarApp.OleProcedure("Quit");
 Close();
}

Вторяя кнопка таким образом служит для выхода из программы и закрытия сервера.

В начало

2.3.1 Вывод текстовой информации.

На первом этапе выводим текст. Пусть на данном этапе необходимо
вывести следующее.

ole_2_2.jpg

Рис 2.2 Вывод текстовой информации.

В обработчике нажатия первой кнопки начнем формировать код программы.

Создаем Объект Word.Application.

 Variant v;
 if(!fStart)
 {
  try
  {
   vVarApp=CreateOleObject("Word.Application");
   fStart=true;
  }
  catch(...)
  {
   MessageBox(0, "Ошибка при открытии сервера Word", 
                 "Ошибка", MB_OK);
  return;
  }
 }

О использовании try catch мы также уже говорили в Ч 1. п 1.3.

Сделаем приложение видимым.

vVarApp.OlePropertySet("Visible",true);

Переменной vVarDocs присваивается значение Documents — свойство объекта
Word.Application, содержащее набор рабочих документов.

vVarDocs=vVarApp.OlePropertyGet("Documents");

Добавляем созданный документ в приложение — для этого надо выполнить вызов,
прототип которого:

vVarDocs.OleProcedure("Add","Template", NewTemplate, DocumentType);

Пре NewTemplate true создается шаблон при false — документ.

Правильно для конретной версии Word создание документа записать как:

vVarDocs.OleProcedure("Add",
"C:\WINDOWS\Application Data\Microsoft\Шаблоны\Normal.dot",  
  false,0);

Посколько расположение шаблонов хранится для всех установленных типов
документов в реестре, то для создания простого документа можно использовать
установки по умолчанию и достаточно записать:

vVarDocs.OleProcedure("Add");

Этот вызов можно повторить столько раз сколько будет создано рабочих
документов. Следует обратить внимание, что обратиться к документу после его
создания можно по свойству Item следующим образом:

vVarDoc=vVarDocs.OleFunction("Item",n);

Здесь n=1 соответствует последнему созданному документу, n-1 предпоследнему,
и. т.д.

Создаем, например 2 документа:

vVarDocs.OleProcedure("Add");
vVarDocs.OleProcedure("Add");

Проверяем, что создано два документа:

if(vVarDocs.OlePropertyGet("Count") != 2)
{
 MessageBox(0, "Ошибка при создании документов",
               "Ошибка", MB_OK);
 return;
}

Будем работать с первым документом, как ни странно его Item = 2:

vVarDoc=vVarDocs.OleFunction("Item",2);

Смотреть будем тоже на первый документ — т.е. активируем его:

vVarDoc.OleProcedure("Activate");

Получаем свойство Paragraphs объекта документ:

 vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");

Задаем текст для вывода:

str="ttОзнакомленtt";

Добавляем параграф:

vVarParagraphs.OleProcedure("Add");

Работаем с первым параграфом:

vVarParagraph=vVarParagraphs.OleFunction("Item",1);

Заносим в него текст:

vVarParagraph.OlePropertyGet("Range").
              OlePropertySet("Text",str.c_str());

Выравниваем по правому краю (wdAlignParagraphRight — по правому краю), по
причинам описанным выше используем константы вместо имен переменных:

vVarParagraph.OlePropertySet("Alignment",2);

Аналогично выводим следующие параграфы, в том числе и пустые:

str="Директорtt=Пупкин=";
vVarParagraphs.OleProcedure("Add");
vVarParagraph=vVarParagraphs.OleFunction("Item",2);
vVarParagraph.OlePropertyGet("Range").
              OlePropertySet("Text",str.c_str());
vVarParagraph.OlePropertySet("Alignment",2);
vVarParagraphs.OleProcedure("Add");
str=""...."...........................2003г.";
vVarParagraphs.OleProcedure("Add");
vVarParagraph=vVarParagraphs.OleFunction("Item",4);
vVarParagraph.OlePropertyGet("Range").
              OlePropertySet("Text",str.c_str());
vVarParagraph.OlePropertySet("Alignment",2);
vVarParagraphs.OleProcedure("Add");
str="Итоги работы за неделю.";
vVarParagraphs.OleProcedure("Add");
vVarParagraph=vVarParagraphs.OleFunction("Item",6);
vVarParagraph.OlePropertyGet("Range").
              OlePropertySet("Text",str.c_str());
vVarParagraph.OlePropertySet("Alignment",1);

Константы выравнивания текста:

  • wdAlignParagraphLeft = 0;

  • wdAlignParagraphCenter = 1;

  • wdAlignParagraphRight = 2;

  • wdAlignParagraphJustify = 3;

  • wdAlignParagraphDistribute = 4;

  • wdAlignParagraphJustifyMed = 5;

  • wdAlignParagraphJustifyHi = 7;

  • wdAlignParagraphJustifyLow = 8.

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

В начало

2.3.2 Изменение параметров документа.

Раскрасим текст как показано на рисунке.

ole_2_3.jpg

Рис 2.3 Изменение параметров текста.

  • 1. Изменяем фон:

     vVarDoc.OlePropertyGet("Background").
             OlePropertyGet("Fill").
             OlePropertyGet("ForeColor").
             OlePropertySet("RGB",RGB(255, 255, 153));
     vVarDoc.OlePropertyGet("Background").
             OlePropertyGet("Fill").
             OlePropertySet("Visible",-1);
     vVarDoc.OlePropertyGet("Background").
             OlePropertyGet("Fill").
             OleFunction("Solid");
    

    Константы отображения OlePropertySet(«Visible», msoTrue);:

    • msoTrue = -1,

    • msoFalse = 0,

    • msoCTrue = 1,

    • msoTriStateToggle = -3,

    • msoTriStateMixed = -2

  • 2. Убираем линейку:

    vVarApp.OlePropertyGet("ActiveWindow").
            OlePropertyGet("ActivePane").
            OlePropertySet("DisplayRulers",false);
    
  • 3. Изменяем размер окна:

    vVarApp.OlePropertySet("WindowState",1);
    
    • wdWindowStateNormal = 0;

    • wdWindowStateMaximize = 1;

    • wdWindowStateMinimize = 2.

  • 4. Убираем лишние панели инструментов:

    vVarApp.OlePropertyGet("CommandBars","Standard").
             OlePropertySet("Visible",false);
    

    Список панелей:

    • Standard

    • Formatting

    • Visual Basic

    • Web

    • Web Tools

    • WordArt

    • AutoText

    • Database

    • Clipboard

    • Picture

    • Frames

    • Reviewing

    • Drawing

    • Forms

    • Control Toolbox

    • Печать книгой

    • Stop Recording

    • Forms

    • Frames

    • Picture

    • Clipboard

    • Tables and Borders

    • Control Toolbox

    • Печать книгой

  • 4. Установка разметки страниц:

     vVarApp.OlePropertyGet("ActiveWindow").
             OlePropertyGet("ActivePane").
             OlePropertyGet("View").
             OlePropertySet("Type",1);
    

    Константы разметок и вида документа:

    • wdNormalView = 1;

    • wdOutlineView = 2;

    • wdPrintView = 3;

    • wdPrintPreview = 4;

    • wdMasterView = 5;

    • wdWebView = 6.

  • 5. Изменяем масштаб отображения документа:

    vVarApp.OlePropertyGet("ActiveWindow").
            OlePropertyGet("ActivePane").
            OlePropertyGet("View").
            OlePropertyGet("Zoom").
            OlePropertySet("Percentage",100);
    
  • 6.Проверка грамматики. Лучше для скорости ее отключить.

    vVarApp.OlePropertyGet("Options").
            OlePropertySet("CheckGrammarAsYouType",false);
    vVarApp.OlePropertyGet("Options").
            OlePropertySet("CheckGrammarWithSpelling",false);
    
  • 7. Устанавливаем параметры шрифта:

    Шрифт устанавливаем для строки параграфа. Так как изменение шрифта
    одинаково для любого параграфа, то описание проводим только для
    заглавия таблицы. Все используемые констнты приведены в конце пункта 8.

    vVarParagraph=vVarParagraphs.OleFunction("Item",6);
    

    Выделяем строку и получаем характеристики шрифта.

    v=vVarParagraph.OlePropertyGet("Range").
                    OlePropertyGet("Font");
    

    Цвет шрифта.

    v.OlePropertySet("Color",255);
    

    Размер шрифта.

    v.OlePropertySet("Size",14);
    

    Имя шрифта.

    v.OlePropertySet("Name","Times New Roman");
    

    Стиль шрифта.

    v.OlePropertySet("Bold",true);
    v.OlePropertySet("Italic",true);
    

    Подчеркивание.

    v.OlePropertySet("Underline",1);
    

    Цвет подчеркивания.

    v.OlePropertySet("UnderlineColor",16711680);
    

    Зачеркивание.

    v.OlePropertySet("StrikeThrough",false);
    v.OlePropertySet("DoubleStrikeThrough",false);
    

    Двойные линии обводки шрифта.

    v.OlePropertySet("Outline",false);
    

    Приподнятый.

    v.OlePropertySet("Emboss",false);
    

    Шрифт с тенями.

    v.OlePropertySet("Shadow",true);
    

    Скрытый

    v.OlePropertySet("Hidden",false);
    

    Все буквы в нижнем регистре.

    v.OlePropertySet("SmallCaps",false);
    

    Все буквы в верхнем регистре.

    v.OlePropertySet("AllCaps",false);
    

    Гравированный шрифт (утопленный).

    v.OlePropertySet("Engrave",false);
    

    В верхнем индексе.

    v.OlePropertySet("Superscript",false);
    

    В нижнем индексе.

    v.OlePropertySet("Subscript",false);
    

    Расстояние между буквами — разрядка в пикселях при + и уплотнение при -.

    v.OlePropertySet("Spacing",0);
    

    Масштаб.

    v.OlePropertySet("Scaling",100);
    

    Смещенный вверх или вниз в пикселях.

    v.OlePropertySet("Position",0);
    

    Кернинг — слияние в пунктах.

    v.OlePropertySet("Kerning",1);
    

    Анимация Обычный набор: красные муравии, мерцание, мигающий
    фон, неоновая реклама, фейерверк, черные муравьи.

    v.OlePropertySet("Animation",0);
    
  • 8. Изменяем шрифт в произвольном месте строки:

    Запоминаем где курсор — свойство Selection

    v=vVarApp.OlePropertyGet("Selection");
    

    Сдвинем курсор на 5 параграфов вниз. Четверка — сдвиг на параграфы.

    v.OleProcedure("MoveDown",4,5);
    

    Встаем на начало строки. Пятерка — в начало строки.

    v.OleProcedure("HomeKey",5);
    

    Сдвигаемся на 6 символов вправо. Единица — символы.

    v.OleProcedure("MoveRight",1,6);
    

    Выделяем 6 букв. Тотже сдвиг, но последняя единица означает выделить.

    v.OleProcedure("MoveRight",1,6,1);
    

    Заменим цвет выделенного текста.

    v.OlePropertyGet("Font").OlePropertySet("Color",8388608);
    

    Константы стилей линий подчеркивания.

    • wdUnderlineNone = 0;

    • wdUnderlineSingle = 1;

    • wdUnderlineWords = 2;

    • wdUnderlineDouble = 3;

    • wdUnderlineDotted = 4;

    • wdUnderlineThick = 6;

    • wdUnderlineDash = 7;

    • wdUnderlineDotDash = 9;

    • wdUnderlineDotDotDash = 10;

    • wdUnderlineWavy = 11;

    • wdUnderlineWavyHeavy = 27;

    • wdUnderlineDottedHeavy = 20;

    • wdUnderlineDashHeavy = 23;

    • wdUnderlineDotDashHeavy = 25;

    • wdUnderlineDotDotDashHeavy = 26;

    • wdUnderlineDashLong = 39;

    • wdUnderlineDashLongHeavy = 55;

    • wdUnderlineWavyDouble = 43.

    Константы цвета — практически это десятичная запись RGB и поэтому
    можно пользоваться любым способом записи, в том числе и принятым в Buildere.

    • wdColorAutomatic = 4278190080;

    • wdColorBlack = 0;

    • wdColorBlue = 16711680;

    • wdColorTurquoise = 16776960;

    • wdColorBrightGreen = 65280;

    • wdColorPink = 16711935;

    • wdColorRed = 255;

    • wdColorYellow = 65535;

    • wdColorWhite = 16777215;

    • wdColorDarkBlue = 8388608;

    • wdColorTeal = 8421376;

    • wdColorGreen = 32768;

    • wdColorViolet = 8388736;

    • wdColorDarkRed = 128;

    • wdColorDarkYellow = 32896;

    • wdColorBrown = 13209;

    • wdColorOliveGreen = 13107;

    • wdColorDarkGreen = 13056;

    • wdColorDarkTeal = 6697728;

    • wdColorIndigo = 10040115;

    • wdColorOrange = 26367;

    • wdColorBlueGray = 10053222;

    • wdColorLightOrange = 39423;

    • wdColorLime = 52377;

    • wdColorSeaGreen = 6723891;

    • wdColorAqua = 13421619;

    • wdColorLightBlue = 16737843;

    • wdColorGold = 52479;

    • wdColorSkyBlue = 16763904;

    • wdColorPlum = 6697881;

    • wdColorRose = 13408767;

    • wdColorTan = 10079487;

    • wdColorLightYellow = 10092543;

    • wdColorLightGreen = 13434828;

    • wdColorLightTurquoise = 16777164;

    • wdColorPaleBlue = 16764057;

    • wdColorLavender = 16751052;

    • wdColorGray05 = 15987699;

    • wdColorGray10 = 15132390;

    • wdColorGray125 = 14737632;

    • wdColorGray15 = 14277081;

    • wdColorGray20 = 13421772;

    • wdColorGray25 = 12632256;

    • wdColorGray30 = 11776947;

    • wdColorGray35 = 10921638;

    • wdColorGray375 = 10526880;

    • wdColorGray40 = 10066329;

    • wdColorGray45 = 9211020;

    • wdColorGray50 = 8421504;

    • wdColorGray55 = 7566195;

    • wdColorGray60 = 6710886;

    • wdColorGray625 = 6316128;

    • wdColorGray65 = 5855577;

    • wdColorGray70 = 5000268;

    • wdColorGray75 = 4210752;

    • wdColorGray80 = 3355443;

    • wdColorGray85 = 2500134;

    • wdColorGray875 = 2105376;

    • wdColorGray90 = 1644825;

    • wdColorGray95 = 789516.

    Константы выравнивания.

    • wdAnimationNone = 0;

    • wdAnimationLasVegasLights = 1;

    • wdAnimationBlinkingBackground = 2;

    • wdAnimationSparkleText = 3;

    • wdAnimationMarchingBlackAnts = 4;

    • wdAnimationMarchingRedAnts = 5;

    • wdAnimationShimmer = 6.

    Константы выделения.

    • wdMove = 0;

    • wdExtend = 1.

  • 9. На данном этапе можно сохранить документ:

    AnsiString vAsCurDir=GetCurrentDir();
    AnsiString vAsCurDir1=vAsCurDir+"\test.doc";
    vVarDoc=vVarDocs.OleFunction("Item",2);         
    vVarDoc.OleProcedure("SaveAs",vAsCurDir1.c_str());
    //Закрыть открытое приложение 
    //vVarApp.OleProcedure("Quit");
    

В начало

2.4 Работа с таблицами.

Добавим к создаваемому документу табличку, как показано на рисунке.

ole_2_4.jpg

Рис 2.4 Пример работы с таблицей.

Для добавления таблицы определим для нее параграф — добавляем два параграфа
и в последнем добавленном параграфе разместим таблицу.

vVarParagraphs.OleProcedure("Add");
vVarParagraphs.OleProcedure("Add");
vVarParagraph=vVarParagraphs.OleFunction("Item",8);

Выбираем ряд в параграфе.

vVarRange = vVarParagraph.OlePropertyGet("Range");

Центрируем содержимое параграфа.

vVarParagraph.OlePropertySet("Alignment",1);

Добавляем таблицу OleProcedure(«Add», Range, Rows, Columns,
DefaultTableBehavior(0,1),AutoFitBehavior(0,1,2)); Две
последние константы определяют стиль таблицы применительно к
версии Word. Таблицу добавляем к активному документу в выбранный
ряд.

vVarDoc.OlePropertyGet("Tables").
        OleProcedure("Add", vVarRange, 3, 9,1,1);

Работать будем с первой таблицей — создана тоже одна.

vVarTable=vVarDoc.OlePropertyGet("Tables").
                  OleFunction("Item",1);

Выравниваем таблицу по центру.

vVarTable.OlePropertyGet("Rows").
          OlePropertySet("Alignment",1);

Константы выравнивания:

  • wdAlignRowLeft = 0;

  • wdAlignRowCenter = 1;

  • wdAlignRowRight = 2.

Установка ширины таблицы Ширина таблицы может быть
фиксированная, иметь разме по содержимому ячеек или ширине окна.

vVarTable.OleFunction("AutoFitBehavior",2);
  • wdAutoFitFixed = 0;

  • wdAutoFitContent = 1;

  • wdAutoFitWindow = 2.

Сетка в таблице как ни странно не свойство самой таблицы.

vVarApp.OlePropertyGet("ActiveWindow").
        OlePropertyGet("View").
        OlePropertySet("TableGridlines",true);

Устанавливаем стиль таблицы.

vVarTable.OleFunction("AutoFormat",25,true,true,
                                      true,true,
                                      true,false,
                                      true,false,true);
           //////Или////////
vVarTable.OleFunction("AutoFormat",25);

Здесь:

OleFunction("AutoFormat",Format,Borders,Shading, 
             Font,Color,HeadingRows,LastRow,
             FirstColumn,LastColumn,AutoFit);

Стилей таблиц в стандартном наборе Word 43 — константы Format от 0 до 42.
Остальные параметры определяют соответственно использование границ, заливки
шрифта, цвета ячеек, оформления верхней, нижней строки, оформления первого
и последнего столбце и автоподборв. При использовании шаблонов достаточно
указать/только Format.

Занесение информации в ячейки. Для этого выполняется следущая
последовательность действий:

  • Выбирается ячейка:

    vVarCell=vVarTable.OleFunction("Cell",x,y);
    -здесь x и y координаты ячейки.
    vVarCell.OleFunction("Select");
  • Выбираем свойство Selection приложения.

    v = vVarApp.OlePropertyGet("Selection").
                OlePropertyGet("Font");
    
  • Изменяем параметры шрифта, те которые изменились с последней
    установки его для свойства Selection, например:

    v.OlePropertySet("Size",16);
    v.OlePropertySet("Underline",0);
    v.OlePropertySet("Color",clYellow);
    
  • Добавляем текст в ячейку:

    vVarCell.OlePropertyGet("Range").
             OlePropertySet("Text","Наш текст");
    

После занесения информации в таблицу поставленная задача выполнена.

В начало

2.5 Текст кода программы.

Файл Unit1.h:

#ifndef      Unit1H
#define      Unit1H
#include     <Classes.hpp>
#include     <Controls.hpp>
#include     <StdCtrls.hpp>
#include     <Forms.hpp>
//-----------------------------------------------
class TForm1 : public TForm
{
 __published:
  TButton         *Button1;
  TButton         *Button3;
  TButton         *Button2;
  void __fastcall Button1Click(TObject *Sender);
  void __fastcall Button3Click(TObject *Sender);
 private:
  Variant         vVarApp,vVarDocs,vVarDoc,vVarParagraphs,
                  vVarParagraph,vVarRange,vVarTables,vVarTable,
                  vVarCell;
 bool             fStart;
 AnsiString       str;
 public:
  __fastcall TForm1(TComponent* Owner);
};
//-----------------------------------------------
extern PACKAGE TForm1 *Form1;
//-----------------------------------------------
#endif

Файл Unit1.cpp

#include      
#pragma       hdrstop
#include      
#include      
#include      "Unit1.h"
#pragma       package(smart_init)
//#include      
#pragma       resource "*.dfm"
#pragma       hdrstop
TForm1        *Form1;
//---------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Variant v,v1;
 if(!fStart)
 {
  try
  {
   //Создаем объект Word.Application
   vVarApp=CreateOleObject("Word.Application");
   fStart=true;
  }
  catch(...)
  {
   MessageBox(0, "Ошибка при открытии сервера Word",
                 "Ошибка", MB_OK);
  return;
  }
 }
 //Делаем сервер видимым
 vVarApp.OlePropertySet("Visible",true);
 //Получаем свойство Documents объекта
 vVarDocs=vVarApp.OlePropertyGet("Documents");
 //Создаем два документа
 vVarDocs.OleProcedure("Add");
 vVarDocs.OleProcedure("Add");
 //Проверяем, что создано два документа
 if(vVarDocs.OlePropertyGet("Count") != 2)
 {
  MessageBox(0, "Ошибка при создании документов",
                 "Ошибка", MB_OK);

  return;
 }
 //Будем работать с первым документом - Item == 2;
 vVarDoc=vVarDocs.OleFunction("Item",2);
 //Смотреть будем тоже на первый документ
 vVarDoc.OleProcedure("Activate");
 //vVarDoc.OleProcedure("Select");
 vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
 //Задаем текст для вывода
 str="ttОзнакомленtt";
 //Добавляем параграф
 vVarParagraphs.OleProcedure("Add");
 //Работаем с первым параграфом
 vVarParagraph=vVarParagraphs.OleFunction("Item",1);
 //Заносим в него текст
 vVarParagraph.OlePropertyGet("Range").
               OlePropertySet("Text",str.c_str());
 //Выравниваем по правому краю
 vVarParagraph.OlePropertySet("Alignment",2);
 //Второй параграф
 str="Директорtt=Пупкин=";
 vVarParagraphs.OleProcedure("Add");
 vVarParagraph=vVarParagraphs.OleFunction("Item",2);
 vVarParagraph.OlePropertyGet("Range").
               OlePropertySet("Text",str.c_str());
 vVarParagraph.OlePropertySet("Alignment",2);
 //Третий параграф - пустой
 vVarParagraphs.OleProcedure("Add");
 //Четвертый параграф
 str=""...."...........................2003г.";
 vVarParagraphs.OleProcedure("Add");
 vVarParagraph=vVarParagraphs.OleFunction("Item",4);
 vVarParagraph.OlePropertyGet("Range").
               OlePropertySet("Text",str.c_str());
 vVarParagraph.OlePropertySet("Alignment",2);
 //Пятый параграф - пустой
 vVarParagraphs.OleProcedure("Add");
 //Шестой параграф
 str="Итоги работы за неделю.";
 vVarParagraphs.OleProcedure("Add");
 vVarParagraph=vVarParagraphs.OleFunction("Item",6);
 vVarParagraph.OlePropertyGet("Range").
               OlePropertySet("Text",str.c_str());
 //wdAlignParagraphCenter
 vVarParagraph.OlePropertySet("Alignment",1);
 //Фон Документа
 vVarDoc.OlePropertyGet("Background").
         OlePropertyGet("Fill").
         OlePropertyGet("ForeColor").
         OlePropertySet("RGB",RGB(255, 255, 153));
 vVarDoc.OlePropertyGet("Background").
         OlePropertyGet("Fill").
         OlePropertySet("Visible",-1);
 vVarDoc.OlePropertyGet("Background").
         OlePropertyGet("Fill").
         OleFunction("Solid");
 //Убираем линейку
 vVarApp.OlePropertyGet("ActiveWindow").
         OlePropertyGet("ActivePane").
         OlePropertySet("DisplayRulers",false);
 //Размер окна
 vVarApp.OlePropertySet("WindowState",1);
 //Панели Инструментов
 vVarApp.OlePropertyGet("CommandBars","Standard").
         OlePropertySet("Visible",false);
 //Разметка страницы
 vVarApp.OlePropertyGet("ActiveWindow").
         OlePropertyGet("ActivePane").
         OlePropertyGet("View").
         OlePropertySet("Type",6);
 //Масштаб отлбражения документа
 vVarApp.OlePropertyGet("ActiveWindow").
         OlePropertyGet("ActivePane").
         OlePropertyGet("View").
         OlePropertyGet("Zoom").
         OlePropertySet("Percentage",100);
 //Проверка грамматики
  vVarApp.OlePropertyGet("Options").
          OlePropertySet("CheckGrammarAsYouType",false);
  vVarApp.OlePropertyGet("Options").
          OlePropertySet("CheckGrammarWithSpelling",false);
 //Шрифт  устанавливаем для строки параграфа
 vVarParagraph=vVarParagraphs.OleFunction("Item",6);
 v=vVarParagraph.OlePropertyGet("Range").
               OlePropertyGet("Font");
 //Цвет шрифта
 v.OlePropertySet("Color",255);
 //Размер шрифта
 v.OlePropertySet("Size",18);
 //Имя шрифта
 v.OlePropertySet("Name","Times New Roman");
 //Стиль шрифта
 v.OlePropertySet("Bold",true);
 v.OlePropertySet("Italic",true);
 //Подчеркивание
 v.OlePropertySet("Underline",1);
 //Цвет подчеркивания
 v.OlePropertySet("UnderlineColor",16711680);
 //Зачеркивание
 v.OlePropertySet("StrikeThrough",false);
 v.OlePropertySet("DoubleStrikeThrough",false);
 //Двойные линии обводки шрифта
 v.OlePropertySet("Outline",false);
 //Приподнятый
 v.OlePropertySet("Emboss",false);
 //Шрифт с тенями
 v.OlePropertySet("Shadow",true);
 //Скрытый
 v.OlePropertySet("Hidden",false);
 //Все буквы в нижнем регистре
 v.OlePropertySet("SmallCaps",false);
 //Все буквы в верхнем регистре
 v.OlePropertySet("AllCaps",false);
 //Гравированный шрифт утопленный
 v.OlePropertySet("Engrave",false);
 //В верхнем индексе
  v.OlePropertySet("Superscript",false);
 //В нижнем индексе
  v.OlePropertySet("Subscript",false);
 //Расстояние между буквами
  v.OlePropertySet("Spacing",0);
 //Масштаб
  v.OlePropertySet("Scaling",100);
 //Смещенный вверх или вниз в пикселях
  v.OlePropertySet("Position",0);
 //Кернинг - слияние в пунктах
 v.OlePropertySet("Kerning",1);
 //Анимация
 v.OlePropertySet("Animation",0);
 //Запоминаем где курсор - свойство Selection
 v=vVarApp.OlePropertyGet("Selection");
 //Сдвинем курсор на 5 параграфов вниз
 v.OleProcedure("MoveDown",4,5);
 //Встанем на начало строки
 v.OleProcedure("HomeKey",5);
 //Сдвигаемся на 13 символов вправо
 v.OleProcedure("MoveRight",1,13);
 //Выделяем "за неделю"
 v.OleProcedure("MoveRight",1,10,1);
 //зменим цвет выделенного текста
 v.OlePropertyGet("Font").
   OlePropertySet("Color",8388608);
 ///////////////////////Cоздание таблицы//////////
 //Добавляем два параграфа
 vVarParagraphs.OleProcedure("Add");
 vVarParagraphs.OleProcedure("Add");
 //Выбираем ряд в параграфе
 vVarParagraph=vVarParagraphs.OleFunction("Item",8);
 vVarParagraph.OlePropertySet("Alignment",1);
 vVarRange = vVarParagraph.OlePropertyGet("Range");
 //Добавляем таблицу
 vVarDoc.OlePropertyGet("Tables").
         OleProcedure("Add", vVarRange, 3, 9,1,1);
 //Работать будем с первой таблицей
 vVarTable=vVarDoc.OlePropertyGet("Tables").
                   OleFunction("Item",1);
 //Выравниваем таблицу по центру
 vVarTable.OlePropertyGet("Rows").
           OlePropertySet("Alignment",1);
 //Установка ширины таблицы
 vVarTable.OleFunction("AutoFitBehavior",2);
 //Сетка в таблице
  vVarApp.OlePropertyGet("ActiveWindow").
          OlePropertyGet("View").
          OlePropertySet("TableGridlines",true);
 //Стиль таблицы
 vVarTable.OleFunction("AutoFormat",25);
 //Занесение информации в ячейки
 for(int i=2;i <= 8;i++)
 {
  vVarCell=vVarTable.OleFunction("Cell",1,i);
  vVarCell.OleFunction("Select");
  v = vVarApp.OlePropertyGet("Selection").
              OlePropertyGet("Font");
  v.OlePropertySet("Size",16);
  v.OlePropertySet("Underline",0);
  v.OlePropertySet("Color",clYellow);
  vVarCell.OlePropertyGet("Range").
           OlePropertySet("Text",i-1);
 }
 random(50);
 int j,k=0;
 for(int i=2;i <= 9;i++)
 {
  vVarCell=vVarTable.OleFunction("Cell",2,i);
  vVarCell.OleFunction("Select");
  v = vVarApp.OlePropertyGet("Selection").OlePropertyGet("Font");
  v.OlePropertySet("Size",14);
  v.OlePropertySet("Underline",0);
  j=random(50);
  if(i != 9)
  {
   vVarCell.OlePropertyGet("Range").
            OlePropertySet("Text",j);
   k=k+j;
  }
  else
   vVarCell.OlePropertyGet("Range").
            OlePropertySet("Text",k);
 }
 k=0;
 for(int i=2;i <= 9;i++)
 {
  vVarCell=vVarTable.OleFunction("Cell",3,i);
  vVarCell.OleFunction("Select");
  v = vVarApp.OlePropertyGet("Selection").
              OlePropertyGet("Font");
  v.OlePropertySet("Size",14);
  v.OlePropertySet("Underline",0);
  j=random(30);
  if(i != 9)
  {
   vVarCell.OlePropertyGet("Range").
            OlePropertySet("Text",j);
   k=k+j;
  }
  else
   vVarCell.OlePropertyGet("Range").
            OlePropertySet("Text",k);
 }
 vVarCell=vVarTable.OleFunction("Cell",1,9);
 vVarCell.OleFunction("Select");
 v = vVarApp.OlePropertyGet("Selection").
             OlePropertyGet("Font");
 v.OlePropertySet("Size",16);
 v.OlePropertySet("Underline",0);
 v.OlePropertySet("Color",clRed);
 vVarCell.OlePropertyGet("Range").
          OlePropertySet("Text","Итог");
 for(int i=1;i <= 3;i++)
 {
  vVarCell=vVarTable.OleFunction("Cell",i,1);
  vVarCell.OleFunction("Select");
  v = vVarApp.OlePropertyGet("Selection").
              OlePropertyGet("Font");
  v.OlePropertySet("Size",16);
  v.OlePropertySet("Underline",0);
  v.OlePropertySet("Color",clBlue);
  v1=vVarApp.OlePropertyGet("Selection").
             OlePropertyGet("ParagraphFormat");
  v1.OlePropertySet("Alignment", 0);
  switch(i)
  {
   case 1:
    vVarCell.OlePropertyGet("Range").
             OlePropertySet("Text","Товар\Дни недели");
   break;
   case 2:
    vVarCell.OlePropertyGet("Range").
             OlePropertySet("Text","Компьютеры:");
   break;
   default:
    vVarCell.OlePropertyGet("Range").
             OlePropertySet("Text","Принтеры:");
  }
 }

 AnsiString vAsCurDir=GetCurrentDir();
 AnsiString vAsCurDir1=vAsCurDir+"\test.doc";
 vVarDoc=vVarDocs.OleFunction("Item",2);
 vVarDoc.OleProcedure("SaveAs",vAsCurDir1.c_str());
}
//---------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
 if(fStart) vVarApp.OleProcedure("Quit");
 Close();
}
//---------------------------------------

В начало

2.6 Работа с диаграммами.

2.6.1 Копирование диаграммы из рабочей книги Excel.

Диаграмму возьмем из созданной в Ч 1. рабочей книге Excel (документ с диаграммой
сохранен под именем amount.xls в текущей директории). Порядок работы с
документом и диаграммой схож с описанным в Ч 1. — создаем объект «Excel.Application»,
и рабочую книгу. Но книгу не добавляем в объект, а открываем существующую.

AnsiString vAsCurDir1=vAsCurDir+"\amount.xls";

Далее активируем текущую страницу книги (а их в книге одна) выбираем
текущий объект диаграммы (диаграмма тоже одна) и выполняем
копирование объекта в буфер обмена.

vVarSheet.OlePropertyGet("ChartObjects").
          OlePropertyGet("Item",1).OleProcedure("Copy");

Для объекта Word аналогично описанному выше создаем два
дополнительных параграфа, выбираем ряд в параграфе и устанавливаем
выравнивание, чтоба диаграмма оказалась в центре документа (параграфа).

При заполнении таблицы последней была заполнена левая ячейка в нижнем
ряду и курсор находится там — свойство «Selection». Получим
положение курсора и сдвинем его на две строчки вниз (wdLine = 5).

Variant v = vVarApp.OlePropertyGet("Selection");
v.OleFunction("MoveDown",5,2);

Здесь константы определяющие тип сдвига:

  • wdCharacter = 1;

  • wdWord = 2;

  • wdSentence = 3;

  • wdParagraph = 4;

  • wdLine = 5;

  • wdStory = 6;

  • wdScreen = 7;

  • wdSection = 8;

  • wdColumn = 9;

  • wdRow = 10;

  • wdWindow = 11;

  • wdCell = 12;

  • wdCharacterFormatting = 13;

  • wdParagraphFormatting = 14;

  • wdTable = 15;

  • wdItem = 16.

Осталось вставить диаграмму в документ

v.OleProcedure("Paste");

Результат работы представлен на рисунке 2.1. Полный текст кода,
реализующего вставку диаграммы, представлен ниже.

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 Variant vVarAppEx,vVarBooks,vVarBook,vVarSheet,vVarRange;
 if(!fStart) return;
 //Создаем объект Excel.Application
 vVarAppEx=CreateOleObject("Excel.Application");
 vVarAppEx.OlePropertySet("Visible",true);
 vVarBooks=vVarAppEx.OlePropertyGet("Workbooks");
 vVarAppEx.OlePropertySet("SheetsInNewWorkbook",1);
 AnsiString vAsCurDir1=vAsCurDir+"\amount.xls";
 vVarBooks.OleProcedure("Open",vAsCurDir1.c_str());
 vVarBook=vVarBooks.OlePropertyGet("Item",1);
 vVarSheet=vVarBook.OlePropertyGet("Worksheets",1);
 vVarSheet.OleProcedure("Activate");
 //Копируем диаграмму в буфер обмена
 vVarSheet.OlePropertyGet("ChartObjects").
           OlePropertyGet("Item",1).OleProcedure("Copy");
 //Перенесем диаграмму в документ Word
 vVarParagraphs.OleProcedure("Add");
 vVarParagraphs.OleProcedure("Add");
 //Выбираем ряд в параграфе
 vVarParagraph=vVarParagraphs.OleFunction("Item",11);
 vVarParagraph.OlePropertySet("Alignment",1);
 Variant v = vVarApp.OlePropertyGet("Selection");
 v.OleFunction("MoveDown",5,2);
 //Вставляем диаграмму
 v.OleProcedure("Paste");
 //Запоминаем результат
 vAsCurDir1=vAsCurDir+"\test.doc";
 vVarDoc=vVarDocs.OleFunction("Item",1);
 vVarDoc.OleProcedure("SaveAs",vAsCurDir1.c_str());
}

В начало

2.7 Некоторые другие возможности.

 //Выведет Microsoft Word
 Label1->Caption=vVarApp.OlePropertyGet("Caption");
 //Добавит к имени документа  слово Wlad - не к имени файла
 vVarApp.OlePropertySet("Caption","Wlad");
 //Откуда запущен Application(Word), можно и установить
 Label1->Caption=vVarApp.OlePropertyGet("Path");
 //Версия приложения, например 9.0
 Label1->Caption=vVarApp.OlePropertyGet("Version");
 //Установить активный  принтер
 vVarApp.OlePropertySet("ActivePrinter","Epson LQ-100 ESC/P 2 on LPT1:");
 //Имя активного принтера - будет выведено, если установлен в системе
 Label1->Caption=vVarApp.OlePropertyGet("ActivePrinter");
 //Имя активного рпинтера
 Label1->Caption=vVarApp.OlePropertyGet("ActivePrinter");
 //В режиме не свернутого окна и не развернутого
 //во весь экран можно получить или установить
 //Размер окна
 vVarApp.OlePropertySet("WindowState",0);
 Label1->Caption=vVarApp.OlePropertyGet("Height");
 vVarApp.OlePropertySet("Left",100);
 vVarApp.OlePropertySet("Width",400);
 vVarApp.OlePropertySet("Top",100);
 vVarApp.OlePropertySet("Height",400);
 Label2->Caption=vVarApp.OlePropertyGet("Height");
 //Имя пользователя запустившего процесс можно получит и учтановить
 Label1->Caption=vVarApp.OlePropertyGet("UserName");
 vVarApp.OlePropertySet("UserName","Petr");
 Label2->Caption=vVarApp.OlePropertyGet("UserName");
 //Аналогично UserAddress
 Label1->Caption=vVarApp.OlePropertyGet("UserAddress");
 vVarApp.OlePropertyGet("System");
 vVarApp.OlePropertyGet("FontNames");
 //Изменить ширину столбца таблицы
 vVarTable=vVarDoc.OlePropertyGet("Tables").OleFunction("Item",1);
 Variant v=vVarTable.OlePropertyGet("Columns");
 //Устанавливаем ширину первого столбца
 v.OleFunction("Item",1).OlePropertySet("Width",50);
 //А так сразу всех
 Variant v=vVarTable.OlePropertyGet("Columns");
 v.OlePropertySet("Width",25);
 //Добавляем строки и столбцы
  vVarTable=vVarDoc.OlePropertyGet("Tables").
                  OleFunction("Item",1);
  //Добавить столбец справа
  Variant v=vVarTable.OlePropertyGet("Columns").
  OleFunction("Item",1).OleFunction("Select");
  vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertColumnsRight");
  //Добавить столбец слева
  v=vVarTable.OlePropertyGet("Columns").
  OleFunction("Item",4).OleFunction("Select");
  vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertColumns");
  //Строку Выше
  v=vVarTable.OlePropertyGet("Rows").
  OleFunction("Item",2).OleFunction("Select");
  vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertRowsAbove",1);
  //Строку Ниже
  v=vVarTable.OlePropertyGet("Rows").
  OleFunction("Item",4).OleFunction("Select");
  vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertRowsBelow",1);
  //Выделить все
  v=vVarTable.OlePropertyGet("Columns").OleFunction("Select");
  //Обнулить
  vVarAppWord.OlePropertyGet("Selection").OleProcedure("Delete");
  //Вращаем лист
  vVarDoc=vVarDocs.OleFunction("Item",1);
  //И сделаем его Альбомным
  vVarDoc.OlePropertyGet("PageSetup").
   OlePropertySet("Orientation",1);
  //Как Выйти из таблицы
  //Зайдем в таблицу
  vVarCell=vVarTable.OleFunction("Cell",1,1);
  vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
  vVarParagraphs.OleProcedure("Add");
  vVarParagraphs.OleProcedure("Add");
  vVarParagraphs.OleProcedure("Add");
  //Выходим из таблицы
  //Сдвинем курсор на 50 параграфов вниз
  //Ячека таблицы считается как параграф. 
  //Четверка - сдвиг на параграфы.
  vVarAppWord.OlePropertyGet("Selection").
              OleProcedure("MoveDown",4,50);
  //Или по линиям 5
  vVarAppWord.OlePropertyGet("Selection").
    OleProcedure("MoveDown",5,7);

  //Как повернуть один лист в документе
 AnsiString str;
 vVarParagraphs=vVarDoc.OlePropertyGet("Paragraphs");
 vVarParagraph=vVarParagraphs.OleFunction("Item",1);
 vVarParagraphs.OleProcedure("Add");
 str="Параграф 1";
 vVarParagraph.OlePropertyGet("Range").
              OlePropertySet("Text",str.c_str());
  vVarParagraphs.OleProcedure("Add");
 vVarParagraph=vVarParagraphs.OleFunction("Item",2);
 str="Параграф 2";
 vVarParagraph.OlePropertyGet("Range").
              OlePropertySet("Text",str.c_str());
 vVarParagraphs.OleProcedure("Add");
 //Берем нужный параграф
 vVarParagraph=vVarParagraphs.OleFunction("Item",3);
 vVarRange = vVarParagraph.OlePropertyGet("Range");
 vVarRange.OleFunction("Select");
 //Selection.InsertBreak Type:=wdSectionBreakNextPage
 vVarAppWord.OlePropertyGet("Selection").OleProcedure("InsertBreak",2);

  vVarParagraphs.OleProcedure("Add");
 //Берем нужный параграф
 vVarParagraph=vVarParagraphs.OleFunction("Item",4);
 vVarRange = vVarParagraph.OlePropertyGet("Range");
 vVarRange.OleFunction("Select");
 str="Параграф 4";
 vVarParagraph.OlePropertyGet("Range").
              OlePropertySet("Text",str.c_str());
 vVarParagraphs.OleProcedure("Add");
 vVarParagraphs.OleProcedure("Add");
 vVarParagraph=vVarParagraphs.OleFunction("Item",6);
 vVarRange = vVarParagraph.OlePropertyGet("Range");
 vVarRange.OleFunction("Select");
 vVarParagraph.OlePropertySet("Alignment",1);
 vVarDoc.OlePropertyGet("Tables").
 OleProcedure("Add", vVarRange, 2, 9,1,1);
 vVarParagraphs.OleProcedure("Add");
 vVarRange = vVarParagraph.OlePropertyGet("Range");
 vVarRange.OleFunction("Select");
 //Вращаем лист
 //И сделаем его Альбомным
 vVarRange.OlePropertyGet("PageSetup").OlePropertySet("Orientation",1);
 //Изменяем межстрочный интервал абзаца по отношению к следующему за ним
 vVarParagraph=vVarParagraphs.OleFunction("Item",2);
 vVarParagraph.OlePropertyGet("Range").OleFunction("Select");
 vVarApp.OlePropertyGet("Selection").OlePropertyGet("ParagraphFormat").
    OlePropertySet("LineSpacing", 25);
 //Изменить формат листа, например сделать его A3
 vVarDoc.OlePropertyGet("PageSetup").OlePropertySet("PageWidth",29.7*28.35);
 vVarDoc.OlePropertyGet("PageSetup").OlePropertySet("PageHeight",42*28.35);


 //Работа с закладками
 //Этот материал прислал специально для сайта Москальченко В.А. (moskalchenko@kubkredit.com.ru). 
 //Он же сообщил, что решение взято на форуме ProgZ.ru и принадлежит участнику форума Rius. 
 AnsiString BoolMarkName = "www";
 Variant Selection = vVarApp..OlePropertyGet("Selection");
 Selection.OleFunction("GoTo", 4294967295, 0, 0, BookmarkName.c_str());
 //4294967295 значение wdGoToBookmark из MSWORD.IDL


 //Станем в начало документа
 AnsiString BookmarkName ="\StartOfDoc";
 Variant Selection = vVarAppWord.OlePropertyGet("Selection");
 Selection.OleFunction("GoTo", 4294967295, 0, 0, BookmarkName.c_str());
 //В продолжение "Станем в начало документа" замена текста в документе "Дмитрий" на "Иван"
 Variant Find = Selection.OlePropertyGet("Find");
 Find.OleProcedure ("Execute","Дмитрий"/*Текст, который будем менять*/,false/*учитывать регистрe*/,
 false/*Только полное слово*/,false/*Учитывать универсальные символы*/,false/*Флажок Произносится как*/,
 false/*Флажок Все словоформы*/,true/*искать вперед*/,1/*Активация кнопки Найти далее*/,
 false/* Задание формата */,"Иван"/*На что заменить*/,2/*Заменить все*/);




В заключении статьи повторим уже сказанное:

Богатства возможностей по управлению серверами автоматизации просто
потрясает, так как нет ни одного действия, которое можно было бы
выполнить в автономно запущенном приложении и которое бы не было доступно
для контроллера автоматизации. К сожалению каждое действие, которое
требуется выполнить, при программировании контроллеоа в среде «Borland C++
Builder», даже при применении описанного выше «хитрого» метода, порой
выполняется с большой затратой времени, но, как поется в песне: «..если долго
мучиться, что-нибудь получится!..». Отправные шаги сделаны. Дерзаем далее
.

В начало

Введение

Работа с OLE-сервером Excel

Пример программы управления OLE сервером Word

Домой


Сайт управляется системой uCoz



Like this post? Please share to your friends:
  • Ole для word на c
  • Ole в delphi для excel
  • Ole word c builder
  • Ole package что это word
  • Ole objects in word