Лекция № 29
Тема: «Создание отчетов в Microsoft Word »
План
1. Общие принципы технологии COM
2. Работа с COM-сервером Microsoft Word
3. Работа с документами в Microsoft Word
4. Использование закладок для формирования документов
5. Работа с таблицами
6. Вставка рисунков и их форматирование
1. Общие принципы технологии COM
Одной из особенностей многозадачных операционных систем является поддержка взаимодействия и обмена информацией между различными программами. Операционная система Windows - не исключение из этого правила и предоставляет множество механизмов такой поддержки. Работа ОС Windows предусматривает передачу и обработку сообщений как между ОС и приложением, так и между приложениями, а также использование динамических библиотек. Этот механизм был использован еще в первых версиях Windows и отразился на методах разработки приложений для этой ОС. С развитием операционной системы развивались и механизмы взаимодействия программ. Развитие шло от обмена сообщениями, использования DLL (Dynamic Link Library библиотеки динамически подключаемых процедур и функций) и механизма DDE (Dynamic Data Exchange, динамического обмена данными) к современным технологим, основанным на OLE (Object Linking and Embedding, связывании и внедрения объектов), COM (Component Object Model, компонентной модели объектов), DCOM (Distributed Component Object Model, распределенной компонентной модели объектов). Этот переход был обоснован тем, что стало недостаточным использование только функций и процедур, предоставляемых внешними программами и библиотеками. На первый план вышла необходимость управления целыми объектами, которые представляют собой приложения или документы. Такая постановка задачи вызвала революционные изменения как в структуре ОС Windows, так и в программах, предназначенных для разработки приложений. Приложения MS Office представляют собой объекты-серверы, которые могут управляться внешними программами, и здесь не последнюю роль играют механизмы СОМ и OLE.
Модель СОМ предоставляет возможность создания многократно используемых объектов в различных приложениях, поддерживающих этот интерфейс. Объектами СОМ являются приложения-серверы, специальным образом оформленные и зарегистрированные в системе. Они могут быть представлены в формате ЕХЕ или DLL-модулей. Эти серверы могут загружаться и выполняться как в адресном пространстве вызывающего их приложения, так и в виде самостоятельного процесса. Они могут быть написаны на любом языке, который поддерживает интерфейс СОМ.
Среда Delphi поддерживает вызовы методов серверов автоматизации.
· Сервер автоматизации представляет собой программу, которая может управляться внешней программой - контроллером автоматизации. Сервером в этом случае является приложение, например Word или Excel, а контроллером автоматизации - программа, которая "умеет" управлять приложениями MS Office и процессом создания документов в среде Word и Excel.
2. Работа с COM-сервером Microsoft Word
Функции, реализующие механизм доступа к COM-объектам, находится в модуле Comobj, который должен быть подключен в коде.
Затем нужно описать переменную (лучше глобальную) для хранения ссылки на сервер в виде:
var w:variant;
После описания переменной можно создать новый объект COM-сервера с помощью команды:
w:=CreateOleObject('Word.Application');
После выполнения этого оператора приложение Word запустится, но его окно не появится на экране монитора. В диспетчере задач в списке процессов можно увидеть, что процесс Winword.exe запущен и находится в памяти компьютера.
Чтобы окно программы стало видимой, необходимо установить следующее свойством:
w.Visible:=true;
При формировании документов, рекомендуется свойство Visible включать после окончания формирования документа. Так можно повысить производительность работы приложения, так как не будут тратиться ресурсы компьютера на отображение на монитора самого процесса построения документа. При этом, пока документ строится, процесс можно сопровождать отображением заполняющего индикатора до 100%.
Запуск или подключения к Word
Мы рассмотрели пример создания нового объекта для запуска копии Microsoft Word. Однако такой подход имеет недостаток: если Word уже будет запущен пользователем, то вызов функции CreateOleObject ( 'Word.Application') запустит новую копию программы, что ведет к нерациональному расходу оперативной памяти компьютера. Для решения данной проблемы нужно иметь в виду, что есть функция, которая не создает объект, а подключается к уже запущенной копии:
w:=GetActiveOleObject('Word.Application');
Перед использованием COM-сервера Word целесообразно выполнять подключение или создание объекта в зависимости от состояния программы Word. Правильный код при обращении к Word следующий:
try
//пытаемся подключиться к запущенной копии Word
w:=GetActiveOleObject('Word.Application');
except
//если подключение не удалось (Word не запущен)
//создаем новый объект, запускаем Word
w:=CreateOleObject('Word.Application');
end;
3. Работа с документами в Microsoft Word
Итак, объект Word загружен, и у нас есть доступ к нему через переменную w. Объект имеет методы, с помощью которых можно создавать, открывать и сохранять документы.
Создание документа
Для создания документа используют метод:
w.Documents.Add;
После выполнения этого метода будет создан документ на основании стандартного шаблона Normal.dot.
Вызвать метода Add можно с аргументом. В этом случае создается документ на основе указанного шаблона. Для своих приложений можно создать дополнительные шаблоны документов, например шаблон формы платежного поручения или налоговой декларации. В дальнейшем, используя метод Add с указанием шаблон, легко создать нужный документ, заполняемый нужной информацией. Использование шаблонов при формировании новых документов позволит создавать гибкие и удобные для пользователя приложения.
Пример. Пусть в папке с программой есть папка шаблонов с именем Templates, а в ней файл шаблона с именем Anketa.dot. Создадим новый документ на основе шаблона.
w.Documents.Add(ExtractFilePath(Application.ExeName) + 'Templates\Anketa.dot');
Сохранение документа
Можно программно сохранить созданный документ на диск. Для этого используется метод вида:
w.ActiveDocument.SaveAs(FileName:='имя файла' [, FileFormat:=число] [, Password:='Пароль']);
Метод имеет аргументы:
· FileName - имя файла;
· FileFormat - формат сохранения файла (0 - документ Word (по умолчанию), 1 - шаблон Word, 2 - только текст, 4 - текст DOS, 6 - текст RTF, 7 - кодированный текст)
· Password - пароль для защиты файла.
Например, пусть в папке с программой имеется вложенная папка Docs. Сохраним документ в эту папку в формате Word под именем Report.doc.
w.ActiveDocument.SaveAs(FileName:= ExtractFilePath(Application.ExeName) + 'Docs\Report.doc');
Сохраним файл еще раз, но с задание мпароля для защиты файла.
w.ActiveDocument.SaveAs(FileName:= ExtractFilePath(Application.ExeName) + 'Docs\Report.doc', Password:='111');
Открытие файла
Для открытия файла используют метод вида:
w.Documents.Open(FileName:='имя файла' [,Format:=число] [,PasswordDocument:='Пароль']);
Метод имеет аргументы:
· FileName - имя файла;
· Format - формат сохранения файла (0 - автовыбор, 1 - документ Word, 2 - шаблон Word, 3 - текст RTF, 4 - обычный текст, 5 - кодированный текст)
· PasswordDocument - пароль на открытие файла.
Например: откроем сохраненный ранее файл:
w.Documents.Open (FileName:=ExtractFilePath(Application.ExeName) + 'Docs\Report.doc', Format:=1);
Если файл имеет пароль, то его можно открыть так:
w.Documents.Open (filename=ExtractFilePath(Application.ExeName) + 'Docs\Report.doc', Format:=1, PasswordDocument:='111');
Закрытие документа и приложения Word
Если документ сохранен, то его можно закрыть с помощью метода:
w.ActiveDocument.Close;
После закрытия документа, можно закрыть и само приложение Word. Для этого используют два оператора:
w.Quit;
w:=UnAssigned;
Используя методы работы с документами, можно организовывать фоновое создания файлов без отображения их на экране.
Пример. На основании шаблона Anketa.dot из папки Templates создать новый документ. Сохранить документ под именем Report.doc в папку Docs. После сохранения выдать сообщение об успешном создании файла и предложить пользователю открыть файл для просмотра. Если ответ положительный, то файл открывается, если отрицательный, то Word закрывается.
// создаем объект (запускаем Word)
w:=CreateOleObject('Word.Application');
// создаем новый документ на основе шаблона
w.Documents.Add(ExtractFilePath(Application.ExeName) +
'Templates\Anketa.dot ');
// сохраняем документ в указанный файл в формате doc
w.ActiveDocument.SaveAs(ExtractFilePath(Application.ExeName) +'Docs\Report.doc', FileFormat:=1);
// выдаем запрос на открытие сохраненного файла
if Application.MessageBox('Файл сохранен. Открыть? ', 'Запрос', mb_yesno + mb_iconquestion) = idyes then
// если ответ Да, делаем Word видимым
w.Visible:=true
else
// если ответ Нет, закрываем документ в Word
begin
w.ActiveDocument.Close;
w.Quit;
w:=UnAssigned;
end;
4. Использование закладок для формирования документов
Шаблоны является самым удобным способом формирования документов Word. Разработчик может создать целую коллекцию шаблонов, в которых задать расположение текстовых блоков и их форматирования. Шаблон может содержать как постоянные элементы, так и элементы-переменные, на место которых будет подставляться другой текст при формировании документа. Такие переменные должны иметь какие-то уникальные в пределах шаблона имена (например: # fam #, # imya #, # otch # и т.п.) и быть оформлены в виде закладок.
Закладка – это текстовое обозначение фрагмента текста в документе. Программа может найти по имени данный фрагмент, обратиться к нему и заменить на нужную информацию. Для создания закладки выделите фрагмент, который является переменной, и выполните команду Вставка – Закладка. В окне введите имя закладки. Для обращения вк нужной закладке в коде используют команду вида:
w.ActiveDocument.Bookmarks.Item('имя_закладки').Range.Text:=значение;
Например, пусть в шаблоне Anketa.dot из папки Templates имеются закладки с именами: fam, imya, otchr. Необходимо на их место подставить значения Иванов, Иван, Иванович.
try
//пытаемся подключиться к запущенной копии Word
w:=GetActiveOleObject('Word.Application');
except
//если подключение не удалось (Word не запущен)
//создаем новый объект, запускаем Word
w:=CreateOleObject('Word.Application');
end;
// создаем новый документ на основе шаблона
w.Documents.Add(ExtractFilePath(Application.ExeName) + 'Templates\Anketa.dot');
// заменяем закладку fam на Иванов
w.ActiveDocument.Bookmarks.Item('fam').Range.Text:='Иванов';
// заменяем закладку imya на Иван
w.ActiveDocument.Bookmarks.Item('imya').Range.Text:='Иван';
// заменяем закладку otch на Иванович
w.ActiveDocument.Bookmarks.Item('otch').Range.Text:='Иванович';
// делаем документ видимым
w.Visible:=true;
Вместо значений в шаблон можно подставлять не только конкретные значения, но и содержимое полей БД. Такой подход позволяет создавать отчеты по БД с экспортом их в Word.
Пример. Пусть в шаблоне Anketa.dot из папки Templates имеются закладки: fam, imya, otch, datar. Необходимо на их место подставить значения полей fam, tab, otch, datar из текущей записи таблицы БД. Для этого напишем код:
try
//пытаемся подключиться к запущенной копии Word
w:=GetActiveOleObject('Word.Application');
except
//если подключение не удалось (Word не запущен)
//создаем новый объект, запускаем Word
w:=CreateOleObject('Word.Application');
end;
// создаем новый документ на основе шаблона
w.Documents.Add(ExtractFilePath(Application.ExeName) + 'Templates\Anketa.dot');
// заменяем закладку fam на поле fam
w.ActiveDocument.Bookmarks.Item('fam').Range.Text:=ADOTable1.FieldByName('fam').AsString;
// заменяем закладку imya на поле imya
w.ActiveDocument.Bookmarks.Item('imya').Range.Text:=ADOTable1.FieldByName('imya').AsString;
// заменяем закладку otch на поле otch
w.ActiveDocument.Bookmarks.Item('otch').Range.Text:=ADOTable1.FieldByName('otch').AsString;
// заменяем закладку datar на поле datar
w.ActiveDocument.Bookmarks.Item('datar').Range.Text:=ADOTable1.FieldByName('datar').AsString;
// делаем документ видимым
w.Visible:=true;
Пример. Пусть с помощью компонента ADOQuery1 на форме отобраны нужные записи (выполнена фильтрация). Необходимо для каждого найденной записи сформировать свой отдельный файл на основании шаблона Anketa.dot.
try
//пытаемся подключиться к запущенной копии Word
w:=GetActiveOleObject('Word.Application');
except
//если подключение не удалось (Word не запущен)
//создаем новый объект, запускаем Word
w:=CreateOleObject('Word.Application');
end;
// становимся на первую найденную запись
ADOQuery1.First;.
// в цикле проходим по всем найденным записям
while not ADOQuery1.EOF do
begin
// создаем новый документ на основе шаблона
w.Documents.Add(ExtractFilePath(Application.ExeName) + 'Templates\Anketa.dot');
// заменяем закладку fam на поле fam
w.ActiveDocument.Bookmarks.Item('fam').Range.Text:=ADOTable1.FieldByName('fam').AsString;
// заменяем закладку imya на поле imya
w.ActiveDocument.Bookmarks.Item('imya').Range.Text:=ADOTable1.FieldByName('imya').AsString;
// заменяем закладку otch на поле otch
w.ActiveDocument.Bookmarks.Item('otch').Range.Text:=ADOTable1.FieldByName('otch').AsString;
// заменяем закладку datar на поле datar
w.ActiveDocument.Bookmarks.Item('datar').Range.Text:=ADOTable1.FieldByName('datar').AsString;
// переходим на следующую найденную запись
ADOQuery1.Next;
end;
// делаем документ видимым
w.Visible:=true;
5. Работа с таблицами
Рассмотренный выше способ работы с шаблонами подходит для формирования отчета по одной записи: в одном документе отражаются данные из отдельной записи таблицы БД.
Чаще приходится формировать отчеты по набору записей. В этом случае такой набор отображается в виде таблицы, в каждой строке которой находится информация об отдельной записи.
Формирование такого документа можно выполнять с помощью шаблона, в котором нужно подготовить только шапку таблицы, задав нужную ширину колонок, выравнивание и формат символов.
Для работы с таблицей имеется большой набор методов и свойств. Для формирования отчетов рассмотрим некоторые из них.
Для обращения к таблице используют запись:
w.ActiveDocument.Tables.Item(i)
где i - номер таблицы (нумерация начинается с 1)
Обратиться к строке таблицы можно с помощью записи:
w.ActiveDocument.Tables.Item(i).Rows.Item(j)
где i - номер таблицы (нумерация начинается с 1)
j - номер строки (нумерация с 1).
Обратиться к колонке таблицы можно с помощью записи:
w.ActiveDocument.Tables.Item(i).Columns.Item(j)
где i - номер таблицы (нумерация начинается с 1;)
j - номер столбца (нумерация с 1).
Обратиться к ячейке таблицы можно с помощью записи:
w.ActiveDocument.Tables.Item(i).Cell(m, n)
где i - номер таблицы (нумерация начинается с 1)
m, n - номер строки и колонки (нумерация с 1).
Обратиться к тексту ячейки таблицы можно с помощью записи:
w.ActiveDocument.Tables.Item(i).Cell(m, n).Range.Text
Для добавления строки в конец таблицы используют команду:
w.ActiveDocument.Tables.Item(i).Rows.Add;
Узнать количество строк или столбцов в таблице можно с помощью свойства:
w.ActiveDocument.Tables.Item(i).Rows.Count
w.ActiveDocument.Tables.Item(i).Columns.Count
На основании этих свойств и методов можно сформировать табличный документ.
Пример. Пусть в папке Templates имеется шаблон List.dot. Шаблон имеет шапку таблицы с заголовками столбцов: № п/п, Фамилия, Имя, Отчество, Дата рождения. Необходимо в документе отразить данные из таблицы БД. Для этого напишем код:
// опишем переменную для хранения номера строки
var r: integer;
begin
try
//пытаемся подключиться к запущенной копии Word
w:=GetActiveOleObject('Word.Application');
except
//если подключение не удалось (Word не запущен)
//создаем новый объект, запускаем Word
w:=CreateOleObject('Word.Application');
end;
// создаем новый документ на основании шаблона
w.Documents.Add(ExtractFilePath(Application.ExeName) + 'Templates\list.dot');
// становимся на первую запись в таблице
ADOTable1.first;
// сначала таблица имеет одну строку (шапку)
r:=1;
// в цикле проходим по всем записям таблицы
while not ADOTable1.EOF do
begin
// добавляем в конец таблицы строку
w.ActiveDocument.Tables.Item(1).Rows.Add;
// увеличиваем количество строк в таблице
r:=r+1;
// в 1 ячейку строки записываем значение № п/п
w.ActiveDocument.Tables.Item(1).Cell(r,1).Range.Text:=IntToStr(r-1);
// во 2 ячейку строки записываем значение поля fam
w.ActiveDocument.Tables.Item(1).Cell(r,2).Range.Text:=ADOTable1.FieldByName('fam').AsString;
// в 3 ячейку строки записываем значение поля imya
w.ActiveDocument.Tables.Item(1).Cell(r,3).Range.Text:=ADOTable1.FieldByName('imya').AsString;
// в 4 ячейку строки записываем значение поля otch
w.ActiveDocument.Tables.Item(1).Cell(r,4).Range.Text:=ADOTable1.FieldByName('otch').AsString;
// в 5 ячейку строки записываем значение поля datar
w.ActiveDocument.Tables.Item(1).Cell(r,5).Range.Text:=ADOTable1.FieldByName('datar').AsString;
// переходим на следующую запись
ADOTable1.Next;
end;
// делаем окно Word видимым для просмотра результата
w.Visible:=true;
end;
Форматирование таблицы
Таблицу можно отформатировать, задав ей тип, толщину и цвет линии границы, а также цвет фона и параметры шрифта.
Каждый элемент таблицы: сама таблицы, строка, столбец, ячейка обладают рядом свойств для форматирования:
· Borders. OutsideLineWidth (2, 4, 6, 8,12, 18, 24, 36, 48) - ширина внешней границы;
· Borders.OutsideColorIndex (0-16) - цвет линии внешней границы;
· Borders.OutsideLineStyle (0-24) - тип линии внешней границы;
· Borders. InsideLineWidth (2, 4, 6, 8,12, 18, 24, 36, 48) - ширина внутренней границы;
· Borders.InsideColorIndex (0-16) - цвет линии внутренней границы;
· Borders.InsideLineStyle (0-24) - тип линии внутренней границы;
· Shading.BackgroundPatternColorIndex (0-16) - цвет фона.
Пример. Пусть на странице документа имеется таблица. В конец таблицы нужно добавить еще одну строку. В предпоследний ячейке этой строки нужно отобразить текст «Всего», а в последний ячейке отразить сумму окладов по предприятию. Сумма окладов рассчитывается с помощью компонента ADOQuery1.
При этом добавленая ??строка обрамляется толстой сплошной линией синего цвета и заливается серым цветом.
// переменные для хранения количества строк и столбцов
var c, r: integer;
. . .
// формируем запрос на расчеты суммы окладов
ADOQuery1.Active:=false;
ADOQuery1.Sql.Text:='select sum (oklad) as summa from sotr';
// выполняем запрос, отбираем нужную сумму
ADOQuery1.Active:=true;
// добавляем в конец таблицы новую строку
w.ActiveDocument.Tables.Item(1).Rows.Add;
// в переменные записываем количество строк и столбцов таблицы
r:=w.ActiveDocument.Tables.Item(1).Rows.Count;
c:=w.ActiveDocument.Tables.Item(1).Columns.Count;
// задаем толщину линии последней строки
w.ActiveDocument.Tables.Item(1).Rows.Item(r).Borders.OutsideLineWidth:=12;
// задаем цвет линии последней строки
w.ActiveDocument.Tables.Item(1).Rows.Item(r).Borders.OutsideColorIndex:=2;
// задаем цвет фона последней строки
w.ActiveDocument.Tables.Item(1).Rows.Item(r).Shading.BackgroundPatternColorIndex:=16;
// в предпоследний ячейке последней строки выводим текст
w.ActiveDocument.Tables.Item(1).Cell(r, c-1).Range.Text:='Всего';
// в последний ячейке последней строки выводим найденную сумму
w.ActiveDocument.Tables.Item(1).Cell(r, c).Range.Text:=ADOQuery1.FieldByName('summa').AsString;
Пример. В таблице четные строки закрасить одним цветом, а нечетные другим (шапку не закрашивать).
// описываем счетчик цикла
var i: integer;
. . .
// цикл начинаем с 2, так как шапка не закрашиваем
for i:= 2 to w.ActiveDocument.Tables.Item(1).Rows.Count do
// если индекс строки нечетный
if i mod 2 <> 0 then
// закрасим строку серым цветом
w.ActiveDocument.Tables.Item(1).Rows.Item(i).Shading.BackgroundPatternColorIndex:=16
// если индекс строки четный
else
// закрасим строку синим цветом
w.ActiveDocument.Tables.Item(1).Rows.Item(i).Shading.BackgroundPatternColorIndex:=2;
6. Вставка рисунков и их форматирование
Кроме текста и таблиц документы могут включать графические элементы - рисунки. Для вставки рисунка в документ используют метод:
w.ActiveDocument.Range.InlineShapes.AddPicture(FileName:='имя_файла', LinkToFile:=false, SaveWithDocument:=true);
Данный метод позволяет вставить указанный рисунок в место положения курсора. Если же нужно, чтобы рисунок появился в нужном место, то целесообразно вставлять рисунок в ячейку таблицы, которая должна быть предварительно создана в файле шаблона. Вставка рисунка в ячейку таблицы выполняется с помощью метода:
w.ActiveDocument.Tables.Item(i).Cell(n, m).Range.InlineShapes.AddPicture(filename:='имя_файла', LinkToFile:=false, SaveWithDocument:=true);
Вставленный рисунок по умолчанию имеет оригинальный размер. Для задания нужного размера рисунка используют свойства:
w.ActiveDocument.InlineShapes.Item(i).Width:=число;
w.ActiveDocument.InlineShapes.Item(i).Height:=число;
где i - номер рисунка в документе (нумерация с 1).
Пример. Пусть в таблице БД имеется поле foto. Нужно создать документ на основании шаблона List.dot из папки Templates, в котором в виде таблицы выдать поля fam, imya, otch и foto.
Для выдачи поля foto содержимое поля нужно сохранять на диске в виде файла, а затем файл вставлять в ячейку таблицы.
Код имеет вид:
// r - номер текущей строки, p - номер рисунка в таблице
var r, p: integer;
begin
try
//пытаемся подключиться к запущенной копии Word
w:=GetActiveOleObject('Word.Application');
except
//если подключение не удалось (Word не запущен)
//создаем новый объект, запускаем Word
w:=CreateOleObject('Word.Application');
end;
// создаем новый документ на основании шаблона
w.Documents.Add(ExtractFilePath(Application.ExeName) + 'Templates\list.dot');
// становимся на первую запись в таблице
ADOTable1.first;
// сначала таблица имеет одну строку (шапку)
r:=1;
// сначала таблица не имеет рисунков
p = 0;
// в цикле проходим по всем записям таблицы
while not ADOTable1.EOF do
begin
// добавляем в конец таблицы строку
w.ActiveDocument.Tables.Item(1).Rows.Add;
// увеличиваем количество строк в таблице
r:=r+1;
// в 1 ячейку строки записываем значение поля fam
w.ActiveDocument.Tables.Item(1).Cell(r,1).Range.Text:=ADOTable1.FieldByName('fam').AsString;
// во 2 ячейку строки записываем значение поля imya
w.ActiveDocument.Tables.Item(1).Cell(r,2).Range.Text:=ADOTable1.FieldByName('imya').AsString;
// в 3 ячейку строки записываем значение поля otch
w.ActiveDocument.Tables.Item(1).Cell(r,3).Range.Text:=ADOTable1.FieldByName('otch').AsString;
// проверяем наличие данных в поле foto
if ADOTable1.FieldByName('foto').AsString <> '' then
// если данные в поле есть, то
begin
// увеличиваем счетчик рисунков документа
p:=p+1;
// сохраняем содержимое поля в файл с именем pictN
TBlobField(ADOTable1.FieldByName('foto')).SaveToFile(ExtractFilePath(Application.ExeName) + 'pict' + IntToStr(p));
// отражаем содержимое файла в 4 ячейке таблицы
w.ActiveDocument.Tables.Item(1).Cell(r, 4).Range.InlineShapes.AddPicture(FileName:=ExtractFilePath(Application.ExeName) + 'pict' + IntToStr(p), LinkToFile:=false, SaveWithDocument:=true);
// задаем ширину рисунка
w.ActiveDocument.InlineShapes.Item(p).Width:=60;
// задаем высоту рисунка
w.ActiveDocument.InlineShapes.Item(p).Height:=40;
// удаляем файл с рисунком
DeleteFile(ExtractFilePath(Application.ExeName) + 'pict' + IntToStr(p));
end;
// переходим на следующую запись
ADOTable1.Next;
end;
Вопросы для самоконтроля
1. Опишите общие понятия технологии COM.
2. Опишите принципы работы с COM сервером Microsoft Word. Приведите пример кода, который подключается к запущенному экземпляра Word или запускает его.
3. Опишите принципы работы с документами Word.
4. Опишите принципы формирования отчета в Word с помощью закладок.
5. Какие свойства и методы объекта Word вы знаете для формирования табличных документов?
6. Как вставить изображение в документ Word?