Работа с MS Word из Delphi

(опубликовано - 13 SoftWare)
Здесь мы рассмотрим пример того, как управлять объектами Word-а (Excel - аналогично) из программ на Delphi. Исходный код примера можно скачать на страничке 'DownLoad'
===== Для чего это нужно? =====
Задачи могут быть самые разные, в общем случае это использование возможностей Word-а в своей программе, например: проверка текста на орфографию; печать текста, графики; экспорт отчетов в Word или изначальное создание их там и т.д.
===== Подготовительные работы. =====
На самом деле существует несколько способов сделать это, мы рассмотрим только один (пример кроме Delphi 5, в Delphi5 для этого есть компоненты на закладке Servers переименуете в программе типы на соответствующие компоненты, дальше так же).
Для начала начнем новый проект File, New Application; File, Save All. Создадим отдельную папку для проекта и сохраним Unit1 как Main, а Project1 как WordWriter.
Далее для работы с Word-ом нам потребуется библиотека типов Word-а, это делается так:
Project, Import Type Library, Add, далее переходим в папку, где стоит Word (у меня это - "c:\program files\microsoft office), заходим в папку Office и выбираем файл - msword8.olb (цифра -? версии Word-а - у Вас может отличаться) или excel8.olb (для Excel).Нажимаем Оk. Delphi создаст 2 файла - Word_tlb.pas и Office_tlb.pas, их надо включить в раздел uses модуля Main нашего проекта:
uses ..., Office_Tlb, word_tlb;
===== Теперь займемся непосредственно программированием. =====
В разделе var опишем следующие переменные:
var
 // класс приложения ворда
 WordApp: Word_tlb.Application_;
 // класс чего-то типа выделения,
 // т.е. говоришь - выделить ячейку с ... по, а результат скидываешь
 // в эту перем и работаешь с этими ячейками как с 1 объектом
 ARange, TempRange: Range;
 // массив документов
 Docs: Documents;
 // 1 документ
 Doc: Document;
 // массив параграфов
 pars: Paragraphs;
 // 1 параграф
 par: Paragraph;
 // параметры для передачи
 Template, temp, OpenAsTemplate: OleVariant;
 // массив таблиц
 tabls: Tables;
 // 1 таблица
 tabl: Table;
 // рабочая переменная
 i: Integer;
Далее проектируем форму:
:1. Поместим вверх нашей формы кнопку - Button1 типа TButton, поменяем заголовок (свойство Caption) на 'Старт'.
:2. Под кнопкой разместим панель - Panel1 типа TPanel. Внутри панели поместим компонент - Bevel1 типа TBevel, поменяем свойство Align на alClient (при этом рамка растянется на всю панель).
:3. Сверху панели (далее все компоненты будут размещаться внутри этой панели) разместим метку - Label1 типа TLabel, поменяем значение свойства Caption на 'Передать в ячейку':
:4. Ниже слева поместим метку - Label1 типа TLabel, свойство Caption поменяем на 'X='
:5. Правее метки помещаем компонент Edit1 типа TEdit, свойство Text меняем на '1'
:6. По правой границе Edit1 помещаем компонент UpDown1 типа tUpDown, в списке свойства 'Associate' выбираем Edit1, свойство 'Position' приравниваем '1'
:7. Чуть отступаем вправо и повторяем шаги 4-6 , заменив Edit1 на Edit2, UpDown1 на UpDown2, Label1 на Label2 соответственно.
:8. Ниже размещаем еще одну метку - Label4 типа TLabel, меняем свойство 'Caption' на 'Новое значение ячейки:'
:9. Ниже размещаем компонент Edit3 типа TEdit, свойство Text меняем на '0'
:10. И, наконец, в самом низу панели размещаем кнопку BitBtn1 типа TBitBtn, меняем свойство 'Kind' на 'bkOk'.
Теперь напашем обработчики - именно в них и заключается вся функциональность программы:
===== Назначим обработчик OnClick компоненту Button1 =====
procedure TForm1.Button1Click(Sender: TObject);
begin
 // если заголовок 'Выход', то закрываем программу
 if Button1.Caption = 'Выход' then
 begin
 Application.Terminate;
 exit;
 end
 else
 // иначе (при первом начатии, когда у нас заголовок 'Старт')
 // переименовываем заголовок в 'Выход'
 Button1.Caption := 'Выход';
 Panel1.Visible := True;
 // создаем экземпляр ворда
 WordApp := CoApplication_.Create;
 // делаем его видимым
 WordApp.Visible := True;
 // шаблон
 template := 'Normal';
 // создать шаблон
 OpenAsTemplate := False;
 // что-то типа оператора with, можно было и напрямую обратиться
 Docs := WordApp.Documents;
 // добавляем документ
 Doc := Docs.Add(template, OpenAsTemplate);
 // выделить все
 ARange := Doc.Range(EmptyParam, EmptyParam);
 // массив параграфов
 pars := doc.Paragraphs;
 // переменная - параметр
 template := arange;
 // новый параграф
 par := pars.Add(template);
 // цвет зеленый
 par.Range.Font.ColorIndex := 11;
 // вставляем текст
 par.Range.InsertBefore('Привет !!!');
 // переменная - параметр
 template := par.Range;
 // новый параграф, чтобы таблица не потерла текст
 par := pars.Add(template);
 // цвет черный
 par.Range.Font.ColorIndex := 0;
 // вставляем текст
 par.Range.InsertBefore('Переключившись в программу, можно програмно менять текст ячеек !');
 // переменная - параметр
 template := par.Range;
 // новый параграф, чтобы таблица не потерла текст
 par := pars.Add(template);
 // выделяем параграф
 arange := par.Range;
 // шрифт - жирный
 ARange.Font.Bold := 1;
 // шрифт - рукописный
 ARange.Font.Italic := 1;
 // получить массив таблиц
 tabls := aRange.Tables;
 // добавляем новую таблицу размером 5 на 5
 tabl := tabls.Add(arange, 5, 5);
 // в цикле
 for i:=1 to 5 do
 // задаем значение ячеек
 tabl.Cell(i, 1).Range.Text := IntToStr(i);
end;
===== Зададим обработчик формы =====
procedure TForm1.FormDestroy(Sender: TObject);
var
 // для параметров
 SaveChanges: OleVariant;
begin
 // если Word не закрыт
 if not VarIsEmpty(WordApp) then
 begin
 { а можно сохранить автоматом:
 // имя файла в оле
 template := 'Имя.doc';
 // если не сохранен, то
 if doc.Saved = false then
 // сохраняем
 Doc.SaveAs(template, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
 короче, пишешь имя объекта, ставишь точку и нажимаешь
 'ctrl'+' ' и изучаешь существующие методы и свойства
 }
 // изменения не сохранять
 SaveChanges := False;
 // то закрыть сначала документ
 Doc.Close(SaveChanges, EmptyParam, EmptyParam);
 // а потом и ворд
 WordApp.Quit(SaveChanges, EmptyParam, EmptyParam)
 end;
end;
===== Назначим обработчик OnClick компоненту Bitbtn1 =====
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 // в соответствующую ячейку ставим соответствующее значение,
 // а можно и наоборот - получать значение из ячейки в переменную
 tabl.Cell(UpDown2.Position, UpDown1.Position).Range.Text := Edit3.Text;
end;
В общем-то, это все...
===== Дополнительная информация =====
* Справка Word-а (по Visual Basic, по умолчанию она не ставится - запустите заново Setup и поставьте в соотв. месте галочку)
* Книги:
** Чарльз Калверт "Энциклопедия пользователя Delphi4" (издательство - DiaSoft)
** Марко Кэнту "Delphi4 для профессионалов" (издательство - Питер)
* Если у Вас другая версия Word-а:
Параметры функций могут отличаться - обратитесь к справке (см выше) или если у Вас версия Delphi 3 и выше, то используем универсальный метод - пишешь имя объекта, ставишь точку (если нужно посмотреть список параметров у функции , то после открывающей скобки), нажимаешь 'ctrl'+'пробел' и изучаешь существующие методы и свойства.
(c) 13 SoftWare. Статья взята с сайта www.vladimir13.narod.ru
Source: Взято из http://forum.sources.ru
ID: 04408
ID: 04436
Category:COM
Category:MS Office