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

Материал из DRKB


 (опубликовано - 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