Управление Word-ом из Дельфи
( 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 опишем следующие переменные:

// класс приложения ворда
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'.

     Теперь напашем обработчики - именно в них и заключается вся функциональность программы:

1.     Назначим   обработчик 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;

2.     Зададим обработчик формы:

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;

3.     Назначим   обработчик OnClick компоненту Bitbtn1 :

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 
// в соотв ячейку ставим соотв значение,
  // а можно и наоборот - получать значение из ячейки в переменную

 
tabl.Cell(UpDown2.Position,UpDown1.Position).
               Range.Text:=Edit3.Text;

end;

в). В общем-то, это все ...

г). Дополнительная информация:

·        Справка Word-а (по Visual Basic, по умолчанию она не ставится - запустите заново Setup и поставте в соотв. месте галочку)

·        Книги:
    - Чарльз Калверт "Delphi 4. Энциклопедия пользователя"
           (издательство - DiaSoft)
    - Марко Кэнту "Delphi4 для профессионалов"
           (издательство - Питер)

·        Если у Вас другая версия Word-а:
  Параметры ф-ций могут отличаться - обратитесь к справке (см выше) или если у Вас версия Delphi 3 и выше, то используем универсальный метод - пишешь имя объекта, ставишь точку (если нужно посмотреть список параметров у функции , то после открывающей скобки ) , нажимаешь 'ctrl'+'пробел' и изучаешь существующие методы и св-ва.

   (c) 13 SoftWare.