logo search
Posobie_Ravino_Atamanov

2.5.5.7. Импорт данных в Microsoft Excel и Microsoft Word

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

В качестве примеров ниже рассмотрены несколько функций, которые позволят запустить MS Word, создать документ, изменить документ (записать текст), сохранить документ и закрыть MS Word. Для создания объекта и его использования применяем переменную W типа Variant и библиотеку ComObj.

Рассмотрим следующий фрагмент кода:

uses ComObj;

var W:variant;

Function CreateWord:boolean;

begin

CreateWord:=true;

try

W:=CreateOleObject('Word.Application');

except

CreateWord:=false;

end;

End;

Для получения доступа к объекту Word.Application в функции CreateWord используем конструктор CreateOleObject ('Word. Application'). Если редактор MS Word не установлен в системе, то будет сгенерирована ошибка, и получится значение функции равное false, если MS Word установлен, и объект будет создан, то получится значение функции равное true.

Эта функция создает объект W, свойства и методы которого можно использовать в дальнейшем. Если выполнить функцию CreateWord, то MS Word будет запущен, но не появится на экране, потому что по умолчанию он запускается в фоновом режиме. Чтобы его активировать (сделать видимым) или деактивировать (сделать невидимым), необходимо использовать свойство Visible объекта W. Оформить это можно в виде функции VisibleWord.

Function VisibleWord (visible:boolean):boolean;

begin

VisibleWord:=true;

try

W.visible:= visible;

except

VisibleWord:=false;

end;

End;

Для создания документа используется объект Documents объекта W. Этот объект имеет метод Add, используя который, и создается новый документ. Пример приведен ниже.

Function AddDoc:boolean;

Var Doc_:variant;

begin

AddDoc:=true;

try

Doc_:=W.Documents;

Doc_.Add;

except

AddDoc:=false;

end;

End;

После создания документа необходимо записать какой-либо текст непосредственно в документ. Для этого используется функция SetTextToDoc:

Function SetTextToDoc(text_: string;InsertAfter_: boolean): boolean;

var Rng_:variant;

begin

SetTextToDoc:=true;

try

Rng_:=W.ActiveDocument.Range;

if InsertAfter_

then Rng_.InsertAfter(text_)

else Rng_.InsertBefore(text_);

except

SetTextToDoc:=false;

end;

End;

В этой функции используется объект Range и его методы InsertAfter и InsertBefore для того, чтобы вставить текст в документ с позиции курсора или до позиции курсора.

После того, как документ создан и в него записан текст, его необходимо сохранить. Для этого используется метод SaveAs объекта ActiveDocument. Функция SaveDocAs использует этот метод и сохраняет документ в заданный файл.

Function SaveDocAs(file_:string):boolean;

begin

SaveDocAs:=true;

try

W.ActiveDocument.SaveAs(file_);

except

SaveDocAs:=false;

end;

End;

Закрыть сохраненный документ можно, используя метод Close объекта ActiveDocument.

Function CloseDoc:boolean;

begin

CloseDoc:=true;

try

W.ActiveDocument.Close;

except

CloseDoc:=false;

end;

End;

Закрыть редактор MS Word можно, используя метод Quit объекта W.

Function CloseWord:boolean;

begin

CloseWord:=true;

try

W.Quit;

except

CloseWord:=false;

end;

End;

Таким образом, можно создать документ, записать в него текст, сохранить документ и отобразить его на экране монитора.

Работа с MS Excel осуществляется аналогичным образом. Самыми необходимыми функциями являются следующие: активизация MS Excel, создание новой книги, открытие ранее созданной книги, отображение книги (книг) и приложения MS Excel, запись информации в ячейку, запись книги на диск и выход (закрытие книги и приложения). Для создания объекта Excel.Application используя переменная E типа Variant и библиотека ComObj.

Доступ к объекту Excel.Application в функции CreateExcel получается с использованием процедуры CreateOleObject ('Excel.Application') стандартной библиотеки ComObj. Если MS Excel не установлен в системе, то будет сгенерирована ошибка и значение функции будет равно false; если MS Excel установлен и объект будет создан, то получится значение функции равное true. Эта функция создает объект E, свойства и методы которого можно использовать в дальнейшем.

uses ComObj, Classes;

var E:variant;

Function CreateExcel:boolean;

begin

CreateExcel:=true;

try

E:=CreateOleObject('Excel.Application');

except

CreateExcel:=false;

end;

end;

End;

Если выполнить функцию CreateExcel, то MS Excel будет запущен, но не будет отображен, потому что по умолчанию он запускается в фоновом режиме. Чтобы его активизировать (сделать видимым) или деактивировать (сделать невидимым), нужно использовать свойство Visible объекта E. Пример оформлен в виде функции VisibleExcel.

Function VisibleExcel(visible:boolean): boolean;

begin

VisibleExcel:=true;

try

E.visible:=visible;

except

VisibleExcel:=false;

end;

End;

Для создания рабочей книги используется метод Add, коллекции Workbooks объекта E. Ниже приведен пример, с помощью которого не только создается новая книга, но и получаеся на нее ссылка

Function AddWorkBook:boolean;

begin

AddWorkBook:=true;

try

E.Workbooks.Add;

except

AddWorkBook:=false;

end;

End;

Чтобы открыть ранее созданную рабочую книгу, используется та же коллекция Workbooks объекта E и метод Open. Пример представлен ниже.

Function OpenWorkBook(file_: string):boolean;

begin

OpenWorkBook:=true;

try

E.Workbooks.Open(file_);

except

OpenWorkBook:=false;

end;

End;

При работе с книгой, желательно иметь возможность добавлять или удалять в ней листы и присваивать им имена. Для работы с листами книги используется коллекция Sheets. Добавить новый лист можно, используя метод Add этой коллекции. Функция AddSheet реализует эту возможность и присваивает новому листу выбранное пользователем имя.

Function AddSheet(newsheet:string):boolean;

begin

AddSheet:=true;

try

E.Sheets.Add;

E.ActiveSheet.Name:=newsheet;

except

AddSheet:=false;

end;

End;

Метод Delete, коллекции Sheets дает возможность удалять созданные листы. При удалении возможно появление диалогового окна MS Excel, которое потребует подтверждения операции. Для отключения диалогового окна MS Excel используется оператор E.DisplayAlerts:=False.

Пример функции для удаления листов.

Function DeleteSheet(sheet:variant):boolean;

begin

DeleteSheet:=true;

try

E.DisplayAlerts:=False;

E.Sheets[sheet].Delete;

E.DisplayAlerts:=True;

except

DeleteSheet:=false;

end;

End;

Обычно книга MS Excel содержит более одного листа. Их количество содержится в свойстве Count коллекции Sheets. Для активации любого листа книги необходимо использовать процедуру Select. Например:

Sheets.Item(a_).Select

Все описанные выше возможности можно реализовать в Delphi как набор отдельных функций. Примеры приведены ниже:

Function CountSheets:integer; {получаем количество листов книги}

begin

try

CountSheets:=E.ActiveWorkbook.Sheets.Count;

except

CountSheets:=-1;

end;

End;

Function GetSheets(value:TStrings):boolean;

// записываем листы книги в value

var a_:integer;

begin

GetSheets:=true;

value.Clear;

try

for a_:=1 to E.ActiveWorkbook.Sheets.Count do

value.Add(E.ActiveWorkbook.Sheets.Item[a_].Name);

except

GetSheets:=false;

value.Clear;

end;

End;

Function SelectSheet (sheet:variant):boolean;

// выбираем лист

begin

SelectSheet:=true;

try

E.ActiveWorkbook.Sheets.Item[sheet].Select;

except

SelectSheet:=false;

end;

End;

После внесения изменений необходимо сохранить рабочую книгу. Для этого используется метод SaveAs коллекции Workbooks или объекта ActiveWorkbook. Функция SaveWorkBookAs реализует эту возможность на Delphi.

Function SaveWorkBookAs(file_:string): boolean;

begin

SaveWorkBookAs:=true;

try

E.DisplayAlerts:=False;

E.ActiveWorkbook.SaveAs(file_);

E.DisplayAlerts:=True;

except

SaveWorkBookAs:=false;

end;

End;

Одновременно может быть открыто несколько книг, в которые вносится или из которых получается информация. Их количество содержится в свойстве Count коллекции WorkBooks.

Активизируется любая книга из списка процедурой Activate:

Windows("Книга1").Activate;

Для закрытия книги используется метод Close коллекции Workbooks или объекта ActiveWorkbook. Функция CloseWorkBook закрывает активный документ.

Function CloseWorkBook:boolean;

begin

CloseWorkBook:=true;

try

E.ActiveWorkbook.Close;

except

CloseWorkBook:=false;

end;

End;

MS Excel закрывается методом Quit объекта Application.

Function CloseExcel:boolean;

begin

CloseExcel:=true;

try

E.Quit;

except

CloseExcel:=false;

end;

End;

Для более подробного изучения возможностей по работе с MS Word и MS Excel следует обратиться к источнику [7]. Здесь же в качестве примера представлены фрагменты процедур по импорту данных в MS Word и MS Excel.

Импорт в MS Word

procedure TFormRez.RzBitBtn6Click(Sender: TObject);

{в раздел uses надо вставить ComObj}

var

WordApp, NewDoc, WordTable: OLEVariant;

iRows, iCols, iGridRows, jGridCols: Integer;

begin

if Rzsavedialog3.Execute=false then exit; { Указываем имя файла Word}

try

WordApp := CreateOleObject('Word.Application'); {запускаем Word}

except

Exit;

end;

NewDoc := WordApp.Documents.Add; {Создаем новый документ в среде Word}

iCols := StringGrid1.ColCount;

iRows := StringGrid1.RowCount;

{Перемнные количества строк и столбцов импортируемой таблицы}

WordTable:=NewDoc.Tables.Add(WordApp.Selection.Range, iRows, iCols); {Формируем заготовку таблицы}

WordTable.Range.Font.Size :=8; {Размер текста символов в таблице 8}

for iGridRows := 1 to iRows do

for jGridCols := 1 to iCols do

WordTable.Cell(iGridRows, jGridCols).Range.Text:=

StringGrid1.Cells[jGridCols - 1, iGridRows - 1];

{заполняем таблицу в Word данными из StringGrid}

WordApp.ActiveDocument.SaveAs(RzSaveDialog3.FileName); {Сохраняем документ под указанным ранее именем}

WordApp.Quit; {Выход из Word}

WordApp := Unassigned;

NewDoc := Unassigned;

WordTable := Unassigned;

end;

Импорт в MS Excel

procedure TFormRez.RzBitBtn2Click(Sender: TObject);

{в раздел uses надо вставить ComObj}

Var XLApp,sheet,colum:variant;

i,j,m,n:integer;

begin

if Rzsavedialog2.Execute=false then exit;{указываем имя файла Excel}

try

XLApp:=CreateOleObject('Excel.Application'); {запускаем Excel}

except

Exit;

end;

XLApp.Workbooks.Add(-4167);{ Создаем рабочую книгу}

XLApp.Workbooks[1].WorkSheets[1].Name:='Результат'; {Создаем рабочий лист с именем Результат}

Colum:=XLApp.Workbooks[1].WorkSheets['Результат'].Columns;

n:=StrToInt(FormHaupt.LabeledEdit4.text);

m:=StrToInt(FormHaupt.LabeledEdit3.text);

{количество строк и столбцов импортируемой таблицы}

for i:=1 to m+1 do Colum:=XLApp.Workbooks[1].WorkSheets['Результат'].Rows;

Colum.columns[1].Font.Bold:=true; {шрифт первого столбца Excel полужирный}

Colum.Rows[1].Font.Bold:=true; {шрифт первой строки Excel полужирный}

Colum.Rows[1].Font.italic:=true; {шрифт первой строки Excel курсив}

Colum.Rows[2].Font.Bold:=true; {шрифт второй строки Excel полужирный}

Sheet:=XLApp.Workbooks[1].WorkSheets['Результат'];

for i:=0 to m do

for j:=0 to n do sheet.cells[j+2,i+1]:=StringGrid1.Cells[i,j]; {копирование данных из Stringgrid}

sheet.cells[1,2]:='Радиус поворота трактора'; {Заголовок таблицы}

{После внесения изменений необходимо сохранить рабочую книгу. Для этого используем метод SaveAs коллекции Workbooks или объекта ActiveWorkbook. Функция SaveWorkBookAs реализует эту возможность на Delphi. Используем E.DisplayAlerts:=False(True) для отключения (включения) диалогового окна подтверждения записи}

XLApp.ActiveWorkbook.SaveAs(RzSaveDialog2.FileName); {Сохраняем Excel под указанным выше именем}

XLApp.Quit; { Выход их Excel}

end;

При необходимости можно аналогичным образом импортировать и другие данные в MS Word и MS Excel.