Суперфункции EXCEL.

Материал из DRKB


Суперфункции EXCEL[править | править код]

Многие программисты и пользователи очень часто предпочитают вместо Word использовать Excel, потому что он особенно удобен для формирования сложных табличных отчетов. Если вы работаете с правовыми информационными системами, то обратили внимание, что все шаблоны, особенно всевозможные налоговые декларации, выполнены в формате Excel. В этой статье начинаем создавать отчеты в Excel из приложений, разрабатываемых в Delphi.

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

Обратимся к постановке задачи. Нам необходимо сформировать документ из прикладной программы на языке Delphi. Как это сделать? Табличный редактор Excel представляет собой COM-сервер и может получать и обрабатывать запросы от внешних программ. Все это позволяет организовать процесс управления и создания документа из внешних программ. Используя этот механизм, можно создать документ программно - так же, как это делается вручную (посредством меню, кнопок и клавиатуры), но гораздо быстрей и эффектней.

Основными объектами, к которым можно обращаться из внешних программ, являются Excel.Application и Excel.Sheet.8. Используя их, можно получить доступ к объектам документа, например, к ячейкам, рисункам, автофигурам и к свойствам самого Excel. Используя основные объекты, можно создать и обращаться к объектам, созданными внешними серверами OLE. Общая объектная модель Excel представляет древовидную структуру и имеет следующий общий вид:

Clip0071.gif


Корневым объектом является Excel.Application. Коллекция Workbooks обеспечивает создание и доступ к любой книге, которая открыта в приложении. Объект Workbook, в свою очередь, содержит коллекцию Sheets, посредством которой можно создавать, удалять и получить доступ к листам документа. И конечный объект Range обеспечивает запись информации в ячейку. Кроме перечисленных, есть и другие объекты, которые будут рассмотрены в следующих частях статьи.

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

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

uses
  ComObj, Classes;

var
  E: Variant;

function CreateExcel(): Boolean;
begin
  Result := True;
  try
    E := CreateOleObject('Excel.Application');
  except
    Result := False;
  end;
end;


Доступ к объекту Excel.Application в нашей функции CreateExcel получаем, используя процедуру CreateOleObject('Excel.Application') стандартной библиотеки ComObj. Если редактор Excel не установлен в системе, то будет сгенерирована ошибка, и мы получим значение функции = False; если Excel установлен и объект будет создан, то получим значение функции = True. Эта функция создает объект E, свойства и методы которого мы будем использовать в дальнейшем. Если выполнить нашу функцию CreateExcel, то Excel будет запущен, но не будет отображен, потому что по умолчанию он запускается в фоновом режиме. Чтобы его активизировать (сделать видимым) или деактивировать (сделать невидимым), используем свойство Visible объекта E. Оформим это в виде функции VisibleExcel. Скобки try .. except везде используются для обработки исключительных ситуаций.

function VisibleExcel(AVisible: Boolean): Boolean;
begin
  Result := True;
  try
    E.Visible := AVisible;
  except
    Result := False;
  end;
end;

Используя эту функцию, мы можем показывать или скрывать Excel с документами.

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

function AddWorkBook(): Boolean;
begin
  Result := True;
  try
    E.Workbooks.Add;
  except
    Result := False;
  end;
end;


Чтобы открыть ранее созданную рабочую книгу, используем ту же коллекцию Workbooks объекта E и метод Open. Смотрите нижеописанный оператор, с помощью которого мы открываем рабочую книгу и получаем на нее ссылку: book_:= Workbooks.Open(file_). Функция OpenWorkBook открывает книгу и возвращает True в случае успешного выполнения.

Function OpenWorkBook(AFileName: string): Boolean;
begin
  Result := True;
  try
    E.Workbooks.Open(AFileName);
  except
    Result := False;
  end;
end;


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

function AddSheet(NewSheet: string): Boolean;
begin
  Result := True;
  try
    E.Sheets.Add;
    E.ActiveSheet.Name := NewSheet;
  except
    Result := False;
  end;
end;


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

function DeleteSheet(sheet: Variant): Boolean;
begin
  Result := True;
  try
    E.DisplayAlerts := False;
    E.Sheets[sheet].Delete;
    E.DisplayAlerts := True;
  except
    Result := False;
  end;
end;


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

For a_ = 1 To Sheets.Count
  MsgBox(Sheets.Item(a_).Name)
Next a_

Для активации любого листа книги необходимо использовать процедуру Select. Смотрите пример:

Sheets.Item(a_).Select

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

function CountSheets(): Integer; // получаем количество листов книги
begin
  try
    Result := E.ActiveWorkbook.Sheets.Count;
  except
    Result := -1;
  end;
end;

// записываем листы книги в value
function GetSheets(value: TStrings): Boolean;
var
  a: Integer;
begin
  Result := True;
  value.Clear;
  try
    for a := 1 to E.ActiveWorkbook.Sheets.Count do
      value.Add(E.ActiveWorkbook.Sheets.Item[a].Name);
  except
    Result := False;
    value.Clear;
  end;
end;

// выбираем лист
function SelectSheet(sheet: Variant): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[sheet].Select;
  except
    Result := False;
  end;
end;


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

function SaveWorkBookAs(AFileName: string): Boolean;
begin
  Result := True;
  try
    E.DisplayAlerts := False;
    E.ActiveWorkbook.SaveAs(AFileName);
    E.DisplayAlerts := True;
  except
    Result := False;
  end;
end;


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

For a_ = 1 To Application.Workbooks.Count
  MsgBox (Application.Workbooks.Item(a_).Name)
Next a_

Для активации любой книги из списка используем процедуру Activate. Смотрите пример:

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

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

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

function CloseWorkBook: Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Close;
  except
    Result := False;
  end;
end;


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

function CloseExcel: Boolean;
begin
  Result := True;
  try
    E.Quit;
  except
    Result := False;
  end;
end;


После того, как создан минимальный набор функций, можно переходить к демонстрации возможностей программирования Excel. Для этого создадим форму и разместим на ней кнопку. В программной части укажем ссылку на используемую библиотеку MyExcel, в процедуре отклика на нажатие запишем следующий программный текст:

procedure TForm1.Button1Click(Sender: TObject);
var
  a: Integer;
begin
  if not CreateExcel then exit;
  MessageBox(Handle, '', 'Запускаем Excel.', 0);
  VisibleExcel(True);
  MessageBox(Handle, '', 'Отобразили Excel на экране.', 0);
  if AddWorkBook then
  begin
    MessageBox(Handle, '', 'Создали новую книгу.', 0);
    AddSheet('Новый лист');
    MessageBox(Handle, '', 'Добавили новый лист.', 0);
    DeleteSheet(2);
    MessageBox(Handle, '', 'Удалили лист №2.', 0);
    GetSheets(ListBox1.Items);
    MessageBox(Handle, '', 'Получили список листов!', 0);
    for a := 1 to CountSheets do
    begin
      ListBox1.ItemIndex := a - 1;
      SelectSheet(ListBox1.Items.Strings[a - 1]);
      MessageBox(Handle, '', PChar('Выбираем лист ' + ListBox1.Items.Strings[a-1] + '!'), 0);
    end;
    SaveWorkBookAs('c:\1.xls');
    MessageBox(Handle, '', 'Сохранили книгу как "c:\1.xls".', 0);
    CloseWorkBook;
    MessageBox(Handle, '', 'Закрыли книгу "c:\1.xls".', 0);
  end;
  CloseExcel;
end;


Мы рассмотрели общий вид объектной модели Excel и примеры нескольких функций работы с книгами и листами. Далее изучим вопросы записи (чтения) информации в ячейки и программирование их свойств. По всем вопросам Вы можете обратиться к автору по адресу _kvn@mail.ru или www.kornjakov.ru.


Доступ к ячейкам Excel[править | править код]

Когда мы уже умеем открывать книгу, выбирать рабочий лист и сохранять книгу, то чтобы создать простой документ в Excel, необходимо и достаточно научиться записывать информацию в ячейки таблицы. Шаблоны многих документов уже разработаны и представлены в разнообразных справочных системах, и целесообразно научиться использовать их в своих приложениях.

Лист книги Excel состоит из множества строк и столбцов, пересечения которых представляют собой отдельные ячейки или множество ячеек, если пересекается множество строк и столбцов. Каждая ячейка может содержать информацию в виде данных различного типа или формул. Кроме данных, ячейка имеет другие свойства, которые определяют ее размер, цвет, стиль, формат данных и другие параметры.

Доступ к ячейке или ячейкам в Excel предоставляет объект Range. Этот объект обладает всеми необходимыми свойствами и методами, чтобы писать, читать из ячейки и изменять все ее свойства. Для того, чтобы просто записать информацию в ячейку, необходимо присвоить объекту Range значение, записанное в переменной типа variant. Например: Range['A1'] := 123.25; или Range['A1'] := 'ячейка';. Для записи (чтения) в ячейку из приложений на Delphi разработаем несколько функций. Аргумент (ARange: string) этих функций может принимать значения, которые соответствуют одной ячейке (например 'A1') или группе ячеек (например 'A1:D5').

function SetRange(ASheet: Variant; ARange: string; AValue: Variant): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange] := AValue;
  except
    Result := False;
  end;
end;


Читать информацию одновременно можно только из одной ячейки. Если попытаться читать из группы ячеек, то можно получить ошибку. Поэтому аргумент ARange: string в функции GetRange принимает только такие значения, как, например 'A1'. В этих функциях чтения и записи, а также и во всех последующих аргумент sheet может принимать как числовые значения (номер листа), так и строковые (имя листа).

function GetRange(ASheet: Variant; ARange: string): Variant;
begin
  try
    Result := E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange];
  except
    Result := Null;
  end;
end;


Высота и ширина ячейки Excel[править | править код]

Чтобы формировать вид документа в процессе его создания, недостаточно только функций записи информации в ячейки, необходимо также изменять ее визуальные параметры. Самое простое, с чего можно начать, - изменение ширины столбцов и высоты строк. Доступ к ширине столбцов можно получить, используя коллекцию Columns. Используя номер колонки в буквенном или числовом формате и свойство коллекции ColumnWidth, можно изменить ширину столбца или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает ширину столбца.

function SetColumnWidth(ASheet, AColumn: Variant; AWidth: Real): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Columns[AColumn].ColumnWidth := AWidth;
  except
    Result := False;
  end;
end;


Для определения ширины столбца используйте следующий оператор:

width := E.ActiveWorkbook.Sheets.Item[sheet].Columns[column].ColumnWidth;


Доступ к высоте строк можно получить, используя коллекцию Rows. Назначая номер строки и свойство коллекции RowHeight, можно изменить высоту строки или назначить ее. Определенная ниже функция, реализованная на Delphi, устанавливает высоту строки.

function SetRowHeight(ASheet, ARow: Variant; AHeight: Real): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Rows[ARow].RowHeight := AHeight;
  except
    Result := False;
  end;
end;


Для определения высоты строки используйте следующий оператор:

height := E.ActiveWorkbook.Sheets.Item[sheet].Rows[row].RowHeight;


Числовой формат ячейки Excel[править | править код]

Данные в ячейках таблицы могут отображаться различным образом (число, дата, время, строка), способ отображения данных называется числовым форматом. Значение числового формата ячейки хранится в свойстве NumberFormat объекта Range, имеет тип строка и может содержать, например, такие значения: 'General', 'hh:mm:ss', '0,000'. Они соответствуют общему формату, формату времени и формату числа с тремя знаками после запятой. Опытным путем можно получить значения всех форматов, для этого в Delphi используем функцию GetFormatRange.

function GetFormatRange(ASheet: Variant; ARange: string): string;
begin
  try
    Result := E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].NumberFormat;
  except
    Result := '';
  end;
end;


Для установки числового формата ячейки можем использовать функцию SetFormatRange, которая записывает значение числового формата в свойстве NumberFormat объекта Range.

function SetFormatRange(ASheet: Variant; ARange, AFormat: string): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].NumberFormat := AFormat;
  except
    Result := False;
  end;
end;


Данная функция изменяет числовой формат не только в одной отдельно взятой ячейке, а также в группе ячеек. Это определяется значением аргумента range:string. Смотрите примеры: 'A:A' - изменение формата во всех ячейках столбца A, '2:5' - изменение формата во всех ячейках столбцов со второй по пятую включительно, 'A:C' - изменение формата во всех ячейках столбцов с A по C включительно; 'A1:C5' - изменение формата во всех ячейках области, ограниченной колонками A...C и строками 1...5 включительно.


Выравнивание текста в ячейке Excel[править | править код]

Следующим шагом изменения режима отображения данных в ячейках книги Excel рассмотрим выравнивание текста по горизонтали и вертикали. Для выравнивания по горизонтали используется свойство HorizontalAlignment объекта Range, которое применяем в функции SetHorizontalAlignment. Если записывать в аргумент Alignment: Integer этой функции определенные числовые константы, то получим различные варианты выравнивания текста по горизонтали. Смотрите список констант и функцию, реализующую выравнивание текста по горизонтали.

const
  xlHAlignCenter = -4108;
  xlHAlignDistributed = -4117;
  xlHAlignJustify = -4130;
  xlHAlignLeft = -4131;
  xlHAlignRight = -4152;
  xlHAlignCenterAcrossSelection = 7;
  xlHAlignFill = 5;
  xlHAlignGeneral = 1;

function SetHorizontalAlignment(ASheet: Variant; ARange: string; AAlignment: Integer): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].HorizontalAlignment := AAlignment;
  except
    Result := False;
  end;
end;


Для выравнивания по вертикали используем свойство VerticalAlignment объекта Range. Смотрите набор констант и функцию SetVerticalAlignment.

const
  xlVAlignBottom = -4107;
  xlVAlignCenter = -4108;
  xlVAlignDistributed = -4117;
  xlVAlignJustify = -4130;
  xlVAlignTop = -4160;

function SetVerticalAlignment(ASheet: Variant; ARange: string; AAlignment: Integer): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].VerticalAlignment := AAlignment;
  except
    Result := False;
  end;
end;


Другие режимы отображения текста в ячейке Excel[править | править код]

Угол, под которым текст отображается в ячейке, определяется свойством Orientation объекта Range. Значение Orientation может находиться в пределах от -90 до 90. Функция SetOrientation реализует эту возможность в приложениях Delphi.

function SetOrientation(ASheet: Variant; ARange: string; AOrientation: Integer): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Orientation := AOrientation;
  except
    Result := False;
  end;
end;


Текст, ширина которого больше ширины ячейки, может отображаться несколькими строками (переносом по словам) или одной строкой. Это свойство ячейки содержится в поле WrapText объекта Range. Функция SetWrapText изменяет это поле и режим отображения текста большой длины.

function SetWrapText(ASheet: Variant; ARange: string; AWrapText: Boolean): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].WrapText := AWrapText;
  except
    Result := False;
  end;
end;


Можно использовать и альтернативный способ для размещения текста большой длины в ячейке. Он основан на автоподборе ширины текста под ширину ячейки. Свойство ShrinkToFit объекта Range определяет этот режим отображения. Смотрите функцию SetShrinkToFit. Если установлен режим "перенос по словам", то действие этой функции отменяется.

function SetShrinkToFit(ASheet: Variant; ARange: string; AShrinkToFit: Boolean): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].ShrinkToFit := AShrinkToFit;
  except
    Result := False;
  end;
end;


Несколько ячеек можно объединить. Для этой цели используется свойство MergeCells объекта Range[range], где range - область для объединения, например "A1:C2". Если в MergeCells записывает значение True, то это приводит к объединению ячеек. Для реализации в приложениях на Delphi используем функцию SetMergeCells.

function SetMergeCells(ASheet: Variant; ARange: string; AMergeCells: Boolean): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].MergeCells := AMergeCells;
  except
    Result := False;
  end;
end;


Выбор шрифта[править | править код]

Для задания шрифта ячеек электронной таблицы используем свойства и поля объекта Font области ячеек Range. В отличие от Delphi, в Excel объект Font имеет дополнительные параметры, но большинство полей совпадают по смыслу и по типу данных. В Excel дополнительно символы могут использоваться как верхний или нижний индексы, могут иметь несколько способов подчеркивания, а цвет символов может задаваться выбором из палитры.

Рассмотрим в деталях объект Font и его поля. Объект Font является свойством ячейки или области ячеек Range, а доступ к нему получаем, используя следующий оператор: E.ActiveWorkbook.Sheets.Item[sheet].Range[range].Font, где E = Excel.Application. Объект Font имеет несколько полей, которые влияют на режим отображения символов ячейки.

  • Name - наименование шрифта в формате string. В это поле записывается имя одного из шрифтов, установленного в системе.
  • Bold - параметр, который может принимать значение True или False и который влияет на толщину символов.
  • Italic - принимает значение True (наклонный) или False (прямой) и отвечает за наклонное написание символов.
  • Strikethrough - равен True, если символы перечеркнутые, или False, если не перечеркнутые.
  • Underline - свойство, которое определяет стиль подчеркивания, имеет тип Integer. Когда Underline = xlUnderlineStyleNone, символы отображаются без подчеркивания, если Underline=xlUnderlineStyleSingle, то используется обычное подчеркивание. Когда необходимо использовать дополнительные виды подчеркивания, то применяем определенные константы (смотрите приложение на домашней странице).
  • Color - цвет символов, тип longint.

Нетрудно провести соответствие между описанием полей объекта Font ячеек Excel и объектом TFont Delphi. Ниже описанная функция использует это соответствие для задания шрифта ячеек таблиц Excel из приложений Delphi. Последним аргументом этой функции является ссылка на объект Font: TFont, который является стандартным типом объекта Delphi. Этот аргумент мы используем для передачи параметров шрифта в Excel.

function SetFontRange(ASheet: Variant; ARange: string; AFont: TFont): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Name := AFont.Name;
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Size := AFont.Size;

    if fsBold in AFont.Style then
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Bold := True
    else
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Bold := False;
  
    if fsItalic in AFont.Style then
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Italic := True
    else
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Italic := False;

    if fsStrikeOut in AFont.Style then
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Strikethrough := True
    else
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Strikethrough := False;

    if fsUnderline in AFont.Style then
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Underline := xlUnderlineStyleSingle
    else
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Underline := xlUnderlineStyleNone;

    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Color := AFont.Color;
  except
    Result := False;
  end;
end;


Так как Excel имеет больше возможностей для отображения шрифта, то для реализации их можно использовать дополнительную функцию SetFontRangeEx. Аргумент Superscript =True определяет написание символов как верхний индекс. Subscript=True отображает символы как нижний индекс. Цвет символов может определяться не только полем Color объекта Font, но и полем ColorIndex того же объекта. ColorIndex может принимать следующие значения: -4105 - соответствует автоматическому выбору цвета; от 1 до 56 - одному из заданных значений палитры цветов. Underline определяет стиль подчеркивания (integer) и может принимать одно из пяти значений (смотрите исходный текст на домашней странице).

function SetFontRangeEx(ASheet: Variant; ARange: string;
  AUnderlineStyle, AColorIndex: Integer; ASuperScript, ASubScript: Boolean): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Superscript := ASuperScript;
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Subscript := ASubScript;
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.ColorIndex := AColorIndex;
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Font.Underline := AUnderlineStyle;
  except
    Result := False;
  end;
end;


Формат границ ячейки[править | править код]

Границы ячейки имеют следующие свойства: цвет, стиль и толщина. Чтобы получить доступ к границе, используем коллекцию Borders объекта Range, которая через индекс (Edge) предоставляет доступ к той или иной стороне границы ячейки (левая, правая и т.д. сторона). Edge может принимать одно из 8 определенных значений. Объекты коллекции Borders определяют цвет границы, который может задаваться выбором из определенной в Excel палитры или как комбинация из трех цветов RGB. Свойство ColorIndex содержит индекс цвета: когда нас не устраивает цвет из заранее определенной палитры, тогда используем свойство Color, в которое запишем значение из комбинации трех основных цветов, например: Color = RGB(200, 100, 125). Стиль границы (LineStyle) имеет тип integer и одно из 8 предопределенных значений (смотрите приложение). Толщина границы (Weight) имеет тип Integer и одно из 4 значений. Исходный текст функции для установки параметров границы ячейки смотрите ниже.

function SetBorderRange(ASheet: Variant; ARange: string;
  AEdge, ALineStyle, AWeight, AColorIndex, AColor: Integer): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Borders.Item[AEdge].Weight := AWeight;
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Borders.Item[AEdge].LineStyle := ALineStyle;
    if AColorIndex > 0 then
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Borders.Item[AEdge].ColorIndex := AColorIndex
    else
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Borders.Item[AEdge].Color := AColor;
  except
    Result := False;
  end;
end;


Формат заливки ячейки[править | править код]

Заливка ячейки определяется цветом, фоновым рисунком и цветом фонового рисунка. Доступ к этим полям осуществляется через объект Interior, который является свойством объекта Range. Цвет заливки может выбираться из определенной палитры цветов, в этом случае индекс цвета записывается в поле ColorIndex. Если необходимо задать цвет, отличный от цветов палитры, используется поле Color, в которое записывается значение комбинации трех основных цветов RGB. Фоновый рисунок заливки выбирается путем записи в поле Pattern константы из списка (смотрите исходный текст на домашней странице). Цвет фонового рисунка выбирается из цветовой палитры с записью в переменную PatternColorIndex цветового индекса или записью непосредственно значения RGB в поле PatternColor. Функция SetPatternRange реализует в среде Delphi управление форматом заливки ячеек. В этой функции, как и во всех предыдущих, действия могут выполняться как над одной ячейкой так и над множеством, все определяется форматом аргумента функции range: string.

function SetPatternRange(ASheet: Variant; ARange: string;
  APattern, AColorIndex, APatternColorIndex, AColor, APatternColor: Integer): Boolean;
begin
  Result := True;
  try
    E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Interior.Pattern := APattern;
    if AColorIndex > 0 then
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Interior.ColorIndex := AColorIndex
    else
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Interior.Color := AColor;
  
    if APatternColorIndex > 0 then
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Interior.PatternColorIndex := APatternColorIndex
    else
      E.ActiveWorkbook.Sheets.Item[ASheet].Range[ARange].Interior.PatternColor := APatternColor;
  except
    Result := False;
  end;
end;


Некоторые дополнительные возможности[править | править код]

Мы рассмотрели основные функции работы с ячейками: запись/чтение и установка формата. К этому можно добавить еще те, которые пригодятся на практике. Если мы работаем с областью, то внутри этой области можно обращаться к ячейкам по номеру колонки и столбца относительно начала этой области. Смотрите пример:

E.ActiveWorkbook.Sheets.Item[sheet].Range['A5:B10'].Cells.Item[1,1] := 2343;

Значение будет записано в ячейку A5.

Для записи формул можно использовать следующий оператор

E.ActiveWorkbook.Sheets.Item[sheet].Range['A1'].Formula := '=$A$4+$A$10';

Для выделения области листа, заполненного информацией, используйте оператор

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

Вычислить количество ячеек, столбцов и строк области листа, заполненного информацией, можно, используя следующие операторы:

E.ActiveWorkbook.Sheets.Item[sheet].UsedRange.Count; // количество ячеек.
E.ActiveWorkbook.Sheets.Item[sheet].UsedRange.Columns.Count; // количество столбцов.
E.ActiveWorkbook.Sheets.Item[sheet].UsedRange.Rows.Count; // количество строк.

Для вычисления адреса заполненной области (левая верхняя ячейка - правая нижняя ячейка) можно использовать оператор

E.ActiveWorkbook.Sheets.Item[sheet].UsedRange.Address

который возвращает строку, содержащую область адресов.


Василий КОРНЯКОВ
Литература: Н. Елманова, С. Трепалин, А.Тенцер, "Delphi 6 и технология COM", "Питер", 2002.

См. также[править | править код]


Author: Василий КОРНЯКОВ
Source: http://www.kornjakov.ru