Word createoleobject word application

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

Сегодня, в последний рабочий день недели, практически весь день провозился над передачей данных из Delphi в Word. Так как подозрение есть, что работа продолжится то решил кое-какие моменты по работе с Microsoft Word в Delphi запечатлеть и у себя в блоге. Написать такую мини-шпаргалку (тем более, что по Excel уже кое что есть).

Для начала, немного общих моментов по работе с MS Office в Delphi. И первое, что мы сделаем — это создадим объект Word.Application. Создается этот объект абсолютно также, как и объект Excel.Application:

uses ComObj;
var Word: variant;
[...]
procedure CreateWord(const Visible: boolean);
begin
  Word:=CreateOleObject('Word.Application');
  Word.Visible:=Visible;
end;

Всё достаточно просто. Далее мы можем работать с объектом следующим образом:

  1. Создавать документ Word с нуля
  2. Открыть уже существующий документ и изменить в нем текст для получения необходимой формы документа.

Рассмотрим оба варианта, т.к. оба они имеют как свои плюсы, так и недостатки.

Чтобы создать новый документ необходимо выполнить метод Add у коллекции Documents, т.е.:

[...]
Word.Documents.Add
[...]

и после этой операции уже начинать работать с документам обращаясь к нему по индексу или имени в коллекции. Также, можно создать новый документ по шаблону (*.dot). Для этого необходимо выполнить тот же метод Add, но с одним входным параметром — путем к файлу-шаблону:

[...]
Word.Documents.Add(TamplatePath:string);
[...]

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

[...]
var List: TStringList;
    i: integer;
begin
  List:=TStringList.Create;
  for i:=1 to Word.Documents.Count do
    List.Add(Word.Documents.Item(i).Name);
end;
[...]

Обратите внимание, что нумерация начинается с 1, а не с нуля. Чтобы активировать любой документ из коллекции для работы, необходимо выполнить метод Activate:

Word.Documents.Item(index).Activate

где index — номер документа в коллекции.

Теперь можно приступать к записи и чтению документа. Для работы с текстов в документе Word, как и в Excel для работы с ячейками таблицы, определен объект Range. Именно методы этого объекта и дают нам возможность работы с текстом. Для начала рассмотрим работу двух основных методов: InsertBefore и InsertAfter.

Как следует из название — первый метод вставляет текст в начало содержимого Range, а второй — в конец. При этом сам объект Range может содержать как весть документ (Document) так и какую-либо его часть. Например, в следующем листинге я вставлю строку в начало документа и затем методом InsertAfter буду добавлять несколько строк текста в конец документа:

[...]
Word.ActiveDocument.Range.InsertBefore('Hello World');
Word.ActiveDocument.Range.InsertAfter('текст после Hello World');
Word.ActiveDocument.Range.InsertAfter('окончание строки в документа');
[...]

При выполнении этих трех операции Range содержал весь документ.

Если работать со всем документом неудобно, а необходимо, например выделить фрагмент с 50 по 100 символ и работать с ним, то можно воспользоваться функцией Range, которая вернет нам необходимый объект Range:

var MyRange: variant;
begin
  MyRange:=WordActiveDocument.Range(50,100);
  MyRange.InsertBefore('Привет');//всё, что было после 50-го символа сдвинулось вправо
end;

Это что касается записи текста. Решение обратной задачи — чтения текста из документа ещё проще. Достаточно воспользоваться свойством Text у объекта Range:

[...]
ShowMessage(Word.ActiveDocument.Range.Text) //весь текст в документе
[...]

Также для чтения документа можно воспользоваться коллекцией документа Words (слова). За слово принимается непрерывный набор символов — цифр и букв, который оканчивается пробелом.

Перечисляются слова документа точно также как и при работе с коллекцией документов, т.е. первое слово имеет индекс 1 последнее — Word.Count.

[...]
  ShowMessage(Word.ActiveDocument.Words.Item(Word.ActiveDocument.Words.Count).Text)
[...]

В данном случае я вывел на экран последнее слово в документе.

Очевидно, что приведенный выше способ работы с документам хорош в случае, когда требуется создать относительно простой документ Word и не требуется лишний раз рассчитывать фрагменты текста, правильно вставлять таблицы и т.д. Если же необходимо работать с документами, которые имеют сложное содержание, например текст в перемежку с рисунками, таблицами, а сам текст выводится различными шрифтами, то, на мой взгляд наиболее удобно использовать второй способ работы с Word в Delphi — просто заменить текст в уже заранее заготовленном документа.

2. Работа с документами Word в Delphi. Открытие готового документа и замена текста.

Чтобы открыть заранее заготовленный документ Word в Delphi достаточно воспользоваться методом Open у коллекции Documents, например так:

var FilePath: string;
[...]
  Word.Documents.Open(FilePath)
[...]

Метод Open можно вызывать с несколькими аргументами:

  • FileName: string — путь и имя файла;
  • ConfirmConversions: boolean — False — не открывать диалоговое окно «Преобразование файла» при открытии файла, формат которого не соответствует формату Word (doc или docx)
  • ReadOnly:boolean — True — открыть документ в режиме «Только для чтения»
  • AddToRecentFiles: boolean — True, чтобы добавить документ в список недавно открытых документов.
  • PasswordDocument: string — пароль для открытия документа
  • PasswordTemplate: string — пароль для открытия шаблона
  • Revert : boolean — True, чтобы вернуться к сохраненному документу, если этот документ открывается повторно.
  • WritePasswordDocument: string — пароль для сохранения измененного документа в файле
  • WritePasswordTemplate:string — пароль для сохранения изменений в шаблоне
  • Format:integer — формат открываемого документа.

Обязательным параметром метода Open является только FileName, остальные — могут отсутствовать. Если же Вам необходимо воспользоваться несколькими параметрами, то их необходимо явно указывать при вызове метода, например:

[...]
  Word.Documents.Open(FileName:=FilePath, ReadOnly:=true)
[...]

В этом случае документ открывается в режиме «Только для чтения». При таком способе вызова (с явным указанием аргументов) положение аргументов может быть произвольным.

Что касается последнего аргумента — Format, то он может принимать  целочисленные значения (применительно к версиям Microsoft Word 2007 и выше) от 0 до 13. При этом, для того, чтобы открыть «родные» вордовские документы (doc) достаточно использовать значения 0 или 6.

Теперь, когда документ открыт его необходимо преобразовать. Обычно я делаю следующим образом: в тех местах документа, в которые необходимо вставить текст я расставляю либо закладки, либо простые строки текста, например, обрамленные символом $ или #. И затем просто выполняю поиск и замену подстрок следующим образом:

function FindAndReplace(const FindText,ReplaceText:string):boolean;
  const wdReplaceAll = 2;
begin
  Word.Selection.Find.MatchSoundsLike := False;
  Word.Selection.Find.MatchAllWordForms := False;
  Word.Selection.Find.MatchWholeWord := False;
  Word.Selection.Find.Format := False;
  Word.Selection.Find.Forward := True;
  Word.Selection.Find.ClearFormatting;
  Word.Selection.Find.Text:=FindText;
  Word.Selection.Find.Replacement.Text:=ReplaceText;
  FindAndReplace:=Word.Selection.Find.Execute(Replace:=wdReplaceAll);
end;

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

Вот, наверное, самые-самые простые методы работы с Word в Delphi. Кстати, пишу пост и, думаю, что у кого-то из читателей может возникнуть вопрос: причём тут Delphi в Internet и Word в Delphi? :) Честно говоря, приведенный выше фрагменты кода можно использовать для нужд в Internet с натяжкой, например, при автосоставлении небольших отчётов по чему-либо. А вообще, в недалеком будущем, есть в планах поразбираться с Тезаурусом Word и попробовать составить небольшой синонимайзер для собственных нужд — он-то и пригодится нам в Internet :)

3.1
8
голоса

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

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

Delphi
это один из самых популярных и эффективных инструментов разработки сложных
приложений и возможность интегрировать средства приложений
MS Office в разрабатываемые в этой среде проекты.

Известно, что Word и Excel является OLE – объектом. Суть OLE технологии возможность из разрабатываемого
приложения (клиента) взаимодействовать с другими приложениями (серверами). Все
приложения
Microsoft Office являются так называемыми «серверами
автоматизации».
Microsoft Word, являясь сервером OLE, позволяет
подключаться к себе клиентам и использовать свои методы и свойства.

Работа с MS Word в Borland Delphi. Для
работы с
Word
файлами нам потребуется библиотека
ComObj, которая входит в стандартную поставку Borland Delphi. Подключается она в разделе Uses.

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

Var

Application: Variant

Begin

Application:=createOLEObject(‘Word.Application’) ;

End;

Сначала вводим
вариантную переменную, затем создаем объект
OLE Word.Application, и присваиваем его этой
переменной. Эта процедура называется «создание экземпляра сервера».
Создав этот объект, мы затем программируем его свойства и методы.

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

Создание нового
документа.
Создание документа
производится методом
Add. Синтаксис метода:

Add
(
Template, NewTemplate, DocumentType, Visible);

Все параметры метода – типа Variant необязательны.

Template

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

NewTemplate

Если использовать значение True, то новый документ открывается как шаблон. Значение
по умолчанию –
False.

DocumentType

Может принимать одно из следующих значений констант
типа
WdNewDocumentType:wdNewBlankDocument (новый
чистый документ),
wdNewEmailMessage(электронное
сообщение) или
wdNewWebPage(Web – страница). Значение по умолчанию wdNewBlankDocument.

Visible

Управляет видимостью созданного документа. Если
указать значение
True, то документ
будет видим. По умолчанию
Microsoft Word открывает документ с свойством Visibleустановленным в True.

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

Application.Documents.Add;

Открытие документа. Открытие существующего документа Word реализуется методом Open. Синтаксис метода:

Open (FileName,
ConfirmConversions, ReadOnly, AddToRecentFiles, PasswordDocument,
PasswordTemplate, Revert, WritePasswordDocument, WritePasswordTemplate, Format,
Encoding, Visible);

Кроме параметра FileName все остальные необязательны.

FileName

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

ConfirmConversions

Если в значении этого параметра
указать значение
True, то в
случае открытия документа с форматом, отличного от
Word, будет выводится диалоговое окно конвертирования
файла. Необязательный параметр.

ReadOnly

Указывая True, открываем документ только для чтения.
Необязательный параметр.

AddToRecentFiles

Устанавливая значение в True, позволяем добавлять имя открываемого файла в список
недавно открытых файлов в меню Файл. Необязательный
параметр.

PasswordDocument

Пароль открываемого документа.
Необязательный параметр.

PasswordTemplate

Пароль открываемого шаблона.
Необязательный параметр.

Revert

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

WritePasswordDocument

Пароль для сохраняемого документа.
Необязательный параметр.

WritePasswordTemplate

Пароль для сохраняемого шаблона.
Необязательный параметр.

Format

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

WdOpenFormat:

wdOpenFormatAllWord,

wdOpenFormatAuto, wdOpenFormatDocument, wdOpenFormatEncodedText, wdOpenFormatRTF,

wdOpenFormatTemplate,

wdOpenFormatText, wdOpenFormatUnicodeText,

wdOpenFormatWebPages.

По умолчанию wdOpenFormatAuto. Необязательный
параметр.

Encoding

Кодировка для просмотра документа,
может принимать любое правильное значение из ряда констант
MsoEncoding. По умолчанию используется системная кодовая
станица, установленная по умолчанию. Необязательный параметр.

Visible

Устанавливая True, предусматриваем видимое открытие документа. По
умолчанию установлено
True.
Необязательный параметр.

Например, для открытия документа «c:1.doc» метод Open применяется как

Application.Documents.Open(‘c:/1.doc’);

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

Обращение к документу. Обращение к открытому документу, как к элементу
набора коллекции, можно по порядковому номеру методом
Item. Например, обращение ко второму документу будет выглядеть как:

Application.Documents.Item(2);

Нумерация всех элементов
в коллекции начинается с единицы, а не с нуля. Аналогичную операцию можно
осуществить еще как:

Application.Documents(2);

Для работы с документом,
его сначала нужно активизировать, т.е. передать ему фокус, подготовить для
редактирования или других операций. Активизирование документа производится
методом Activate. Для активизации документа, его нужно выбрать из коллекции
по его порядковому номеру:

Application.Documents.Item(2).Activate; или по имени файла

Application.Document(‘c:1.doc’).Activate;

К активному документу
можно обращаться, используя свойство ActiveDocument, например, закрыть
активный документ:

Application.ActiveDocument.Close;

Вставка текста в
документ
. Далее по тексту мы в
основном будем манипулировать коллекций объектов
Range, т.е. весь текст удобно будет
рассматривать как несколько непрерывных областей. Добавление текста
осуществляется следующим образом: сначала создается объект
Range, представляющий собой непрерывную область
документа, затем методами этого объекта добавляется текст. Объект
Range может объявляться как:

выражение. Range (начало области,
конец области);

Например, объявленный ниже объект Range1 охватывает собой первые 10 символов
второго документа.

Var

Range1:variant;

Begin

Range1:=Application.Documents(2).Range(1,10);

End;

В документе сначала
можно создавать абзацы, т.е. объекты
Paragraphs, и затем объединять их
в области. К примеру, в начале активного документа методом
Add объекта Paragraphs создаем новый абзац, затем на его основе создаем
объект
Range1:

Var

Range1:variant;

Begin

Application.ActiveDocument.Paragraphs.Add;

Range1:=Application.ActiveDocument.Paragraphs.Item(1).Range;

End;

Вставка текста производится
двумя методами объекта
Range: InsertAfter и InsertBefore. Синтаксис методов:

выражение. InsertAfter(текст);

Этим методом
производится вставка текста после начала объекта
Range выражение. InsertBefore(текст), а этим –   до.

При использовании этих
методов, в качестве параметра указать нужно только текст в апострофах. К
примеру, вызов двух операторов даст нам две строки: это вставленный текст
InsertBefore и это текст InsertAfter:

Range1.InsertAfter(это текст InsertAfter ‘);

Range1.InsertBefore(‘это вставленный текст InsertBefore‘);

У объекта Range есть много полезных свойств. Например:

Свойство Font (шрифт), которое имеет свои подсвойства:

Font.Bold:=True –   жирность шрифта

Font.Name:=»Arial» – название
шрифта

Font.Size:= 24 –  размер шрифта

Font.Color:= clRed –   цвет
шрифта

Font.Italic:= True –   наклонность шрифта

Например, вставка жирной строки зеленого цвета:

Range1.Font.Bold:=True;

Range1.Font.Size:=14;

Range1.Font.Color:=clGreen;

Range1.InsertAfter(вставленная строка‘);

Объект типа Range можно форматировать. Например, следующей строкой содержимое
объекта
Range выравнивается по центру:

Range1.ParagraphFormat.Aligment:=wdAlignParagrapfCenter;

Работа с Excel
файлами в Delphi. Для работы с Excel файлами в Delphi так же нужно подключить модуль ComObj в разделе Uses.

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

var

Excel: Variant;

Excel := CreateOleObject(‘Excel.Application‘);

Сначала вводим
вариантную переменную, затем создаем объект
OLE Excel.Application, и присваиваем его этой
переменной. Эта процедура называется «создание экземпляра сервера».
Создав этот объект, мы затем программируем его свойства и методы.

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

Создание новой книги:

Excel.Workbooks.Add;

Открытие существующей книги (где путь – путь к файлу с расширением xls.):

Excel.Workbooks.Open[путь]; //(Excel.Workbooks.Open(‘c:2.xls‘));

Открытие существующей книги только для чтения:

Excel.Workbooks.Open[путь, 0,
True];

Excel.Workbooks.Open(‘c:2.xls’,0,true);

Закрытие Excel:

Excel.ActiveWorkbook.Close;

Excel.Application.Quit;

Отображаем или скрываем Excel на экране:

Excel.Visible := True;

Excel.Visible := False;

Печать содержимого активного листа Excel:

Excel.ActiveSheet.PrintOut;

Чтение/запись данных
в
Excel.
Доступ к ячейке в текущей книге Excel можно осуществить следующим
образом:

// запись значения в
ячейку

Excel.Range[‘A2′]:=’Привет!’;

// чтение значения
из ячейки

s:=Excel.Range[‘A2’];
где A2 – адрес ячейки.

Или
используя стиль ссылок R1C1:

Excel.Range[excel.Cells[2, 2]]:=’Привет!’; где [2, 2] – координата
ячейки.

Вообще,
ячейке Excel можно присваивать любое значение (символьное, целое, дробное,
дата) при этом Excel установит форматирование в ячейке применяемое по
умолчанию.

Формат ячеек в Excel. Выделить (выбрать) группу ячеек для последующей работы можно так:

Excel.Range[Excel.Cells[1,
1],Excel.Cells[5, 3]].Select;
либо

Excel.Range[‘A1:C5’].Select;

При этом
будет выделена область находящаяся между ячейкой A1 и C5.

После выполнения
выделения можно установить:

1) Объединение ячеек:

Excel.Selection.MergeCells:=True;

2) Перенос по
словам:

Excel.Selection.WrapText:=True;

3) Горизонтальное
выравнивание:

Excel.Selection.HorizontalAlignment:=3;

при
присваивании значения 1 используется выравнивание по умолчанию,

при 2 –
выравнивание слева,3 – по центру, 4 – справа.

4) Вертикальное
выравнивание

Excel.Selection.VerticalAlignment:=1;

присваиваемые
значения аналогичны горизонтальному выравниванию.

5) Граница
для ячеек:

Excel.Selection.Borders.LineStyle:=1;

При
значении 1 границы ячеек рисуются тонкими сплошными линиями. Кроме этого можно
указать значения для свойства Borders, например, равное 3. Тогда установится
только верхняя граница для блока выделения:

Excel.Selection.Borders[3].LineStyle:=1;

Значение свойства Borders задает различную комбинацию граней ячеек.В
обоих случаях можно использовать значения в диапазоне от 1 до 10.



Работа с 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



Цитата
Сообщение от droider
Посмотреть сообщение

Вы о чем?? Режим редактирования так и называется поскольку позволяет редактировать документ!

Я вот об этих основах работы с ворд….

скачайте папку, в ней документ, откроется в режиме просмотра (форматирование текста искажено), нажмите вид-изменить документ (документ в режиме редактирования, с ВЕРНЫМ форматированием текста) НО! благодаря тому что редактирование при защите документа было разрешено только в «Ввод данных в поля форм» — РЕДАКТИРОВАНИЕ и КОПИРОВАНИЕ документа будет ЗАПРЕЩЕНО.

А еще при помощи этого метода можно частично запретить редактирование текста (например если отправлять кому то электронный договор можно оставить редактируемыми только те строки которые нужны при заполнении, делается для того что бы не вычитывать договор несколько раз, а то мало ли что туда вздумают дописать ……)

Добавлено через 1 минуту
Спасибо огромное за помощь! Буду думать дальше!

Добавлено через 1 час 4 минуты

Delphi
1
2
3
4
 Word:=CreateOleObject('Word.Application');
  Word.Visible:=Visible;
     Word.Documents.Open( (ExtractFilePath(Application.ExeName)+'1.doc') , ReadOnly:=false);
     Word.ActiveWindow.ActivePane.View.Type:=3;

если кому вдруг понадобиться…..вот решение

procedure TForm1.Button1Click(Sender: TObject);

var Word: variant;

begin

try

Word := CreateOleObject(‘Word.Application’);

except

ShowMessage(‘Не могу запустить Microsoft Word’);

end;

Word.Visible := True;

end;

Как создать новый документ Word в Delphi:

//Создание нового документа:

Word.Documents.Add;

Как открыть существующий документ Word в Delphi:

//Открытие существующего документа:

Word.Documents.Open(‘c:test.doc’);

Как добавить текст в документ Word в Delphi:

//Добавление текста в документ:

Word.Selection.TypeText(Text:=‘Новый текст’);

Как добавить абзац Word в Delphi:

//Добавление абзаца:

Word.Selection.TypeParagraph;

Как закрыть документ Word в Delphi:

//Закрытие документа

Word.Quit;


Like this post? Please share to your friends:
  • Word create template from document
  • Word create protected form
  • Word create new page
  • Word create contents list
  • Word create check box