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

EXCEL. Часть 6

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


Тип диаграммы

Тип диаграммы определяет, каким образом отображается информация: в виде плоских или объемных фигур или графиков, а также сам вид этих фигур. Существует около 70 типов диаграмм, и чтобы выбрать один из них, используется метод ApplyCustomType. В качестве аргумента этого метода используется константа из списка (см. приложение www.kornjakov.ru/st2_6.zip). В Delphi выбор типа диаграммы можно реализовать, используя функцию SetChartType.

Function SetChartType (Name:variant;ChartType:integer):boolean;
begin
 SetChartType:=true;
 try
  E.Charts.Item[name].ApplyCustomType(ChartType:=ChartType);
 except
  SetChartType:=false;
 end;
End;


Размещение диаграммы

Диаграмма может размещаться совместно с данными или на отдельном листе. Размещение диаграммы лучше совмещать с процессом ее создания, но можно выполнить эту процедуру и самостоятельно. При этом необходимо учитывать, что при изменении размещения меняется и имя диаграммы (не путать с названием). Для размещения диаграммы используйте функцию SetChartLocation, аргумент xlLocation которой может иметь одно из двух значений (xlLocationAsNewSheet или xlLocationAsObject).

Function SetChartLocation (var name:variant;sheet:variant;
  xlLocation:integer):boolean;
begin
 SetChartLocation:=true;
 try
  name:=E.Charts.Item[name].Location(Where:=
   xlLocationAsObject,Name:=sheet).name;
 except
 SetChartLocation:=false;
 end;
End;


Наклон и поворот

Наклон диаграммы можно выполнить на угол от -90° до +90°. Значения, выходящие за эти пределы, вызывают ошибку. Выбор угла поворота осуществляется записью значения угла в свойство Elevation объекта Chart. Поворот диаграммы осуществляется записью в поле Rotation объекта Chart значения угла поворота. Этот угол может иметь значения от 0° до 360°. Для задания углов наклона и поворота в приложениях на Delphi можно использовать функции ElevationChart и RotationChart.

Function ElevationChart (Name:variant;Elevation:real):boolean;
begin
 ElevationChart:=true;
 try
  E.Charts.Item[name].Elevation:=Elevation;
 except
  ElevationChart:=false;
 end;
End;
Function RotationChart(Name:variant;Rotation:real):boolean;
begin
 RotationChart:=true;
 try
  E.Charts.Item[name].Rotation:=Rotation;
 except
  RotationChart:=false;
 end;
End;


Легенда

Легенда диаграммы представляет собой подписи к той части, которая передает информацию в графическом виде. Как и любая область, она обладает типичными свойствами, присущими им. Есть одно отличие - шрифт элемента легенды. Чтобы легенда была видима на диаграмме, установите поле HasLegend объекта Chart в True.E.Charts.Item[name].HasLegend:=True. Затем можно установить координаты и размеры легенды, параметры границы (рамки) и области. Для этого используем следующие функции:

Установка размеров и координат.

Function PositionSizeLegend (Name:variant;
  Left,Top,Width,Height:real):boolean;
begin
 PositionSizeLegend:=true;
 try
  E.Charts.Item[name].Legend.Left:=Left;
  E.Charts.Item[name].Legend.Top:=Top;
  E.Charts.Item[name].Legend.Width:=Width;
  E.Charts.Item[name].Legend.Height:=Height;
 except
  PositionSizeLegend:=false;
 end;
End;

Установка типа и цвета рамки.

Function BorderLegend (Name:variant;
  Color,LineStyle,Weight:integer):boolean;
begin
 BorderLegend:=true;
 try
  E.Charts.Item[name].Legend.Border.Color:=Color;
  E.Charts.Item[name].Legend.Border.Weight:=Weight;
  E.Charts.Item[name].Legend.Border.LineStyle:=LineStyle;
 except
  BorderLegend:=false;
 end;
End;

Установка цвета и типа узора области.

Function BrushLegend (Name:variant;
  Color,Pattern,PatternColor:integer):boolean;
begin
 BrushLegend:=true;
 try
  E.Charts.Item[name].Legend.Interior.Color:=Color;
  E.Charts.Item[name].Legend.Interior.Pattern:=Pattern;
  E.Charts.Item[name].Legend.Interior.PatternColor:=PatternColor;
 except
  BrushLegend:=false;
 end;
End;

Заливка области из файла.

Function BrushLegendFromFile (Name:variant;File_: string):boolean;
begin
 BrushLegendFromFile:=true;
 try
  E.Charts.Item[name].Legend.Fill.UserPicture(PictureFile:=File_);
  E.Charts.Item[name].Legend.Fill.Visible:=True;
 except
  BrushLegendFromFile:=false;
 end;
End;

Шрифт элемента легенды.

Объект Legend имеет доступ к коллекции LegendEntries, посредством которой можно получить доступ к шрифту элемента легенды. Например: E.Charts.Item[name].Legend.LegendEntries.Item[LegendEntries].Font, где LegendEntries - индекс элемента. Чтобы согласовать поля объектов "Шрифт" в Excel и Delphi, напишем функцию FontToEFont, которая преобразует шрифт объекта Delphi в шрифт объекта Excel. Эту функцию можно будет использовать везде, где необходимо установить шрифт.

Function FontToEFont (font:Tfont;EFont:variant):boolean;
Begin
 FontToEFont:=true;
 try
  EFont.Name:=font.Name;
  if fsBold in font.Style
   then EFont.Bold:=True // Жирный
   else EFont.Bold:=False; // Тонкий
  if fsItalic in font.Style
   then EFont.Italic:=True // Наклонный
   else EFont.Italic:=False; // Наклонный
  EFont.Size:=font.Size; // Размер
  if fsStrikeOut in font.Style
   then EFont.Strikethrough:=True // Перечеркнутый
   else EFont.Strikethrough:=False; // Перечеркнутый
  if fsUnderline in font.Style
   then EFont.Underline:=xlUnderlineStyleSingle // Подчеркивание
   else EFont.Underline:=xlUnderlineStyleNone; // Подчеркивание
  EFont.Color:=font.Color; // Цвет
 except
  FontToEFont:=false;
 end;
End;

Функция FontLegendEntries устанавливает шрифт элемента(LegendEntries) легенды(Name).

Function FontLegendEntries(Name,LegendEntries:variant;
  Font:TFont):boolean;
begin
 FontLegendEntries:=true;
 try
  FontLegendEntries:=
   FontToEFont(Font,E.Charts.Item[name].Legend.LegendEntries.Item[LegendEntries].Font);
 except
  FontLegendEntries:=false;
 end;
End;


Подписи осей

Оси диаграммы могут иметь подписи, представляющие собой области и описываемые свойствами, присущими любым прямоугольным областям на диаграмме. Рассмотрим только запись текста и включение, выключение отображения объекта "подпись оси". Доступ ко всем полям и методам подписи осуществляется через коллекцию Axes, члены которой и есть ссылки на подписи. В приложениях Delphi запись текста в объект "подпись оси" можно реализовать с помощью функции AxisChart.

Function AxisChart (Name:variant;Category,Series,Value:string):boolean;
begin
 AxisChart:=true;
 try
  if Category<>'' then E.Charts.Item[name].Axes[xlCategory].HasTitle:=True
   else E.Charts.Item[name].Axes[xlCategory].HasTitle:=False;
  if Series<>'' then E.Charts.Item[name].Axes[xlSeries].HasTitle:=True
   else E.Charts.Item[name].Axes[xlSeries].HasTitle:=False;
  if Value<>'' then E.Charts.Item[name].Axes[xlValue].HasTitle:=True
   else E.Charts.Item[name].Axes[xlValue].HasTitle:=False;
  E.Charts.Item[name].Axes[xlCategory].AxisTitle.Text:=Category;
  E.Charts.Item[name].Axes[xlSeries].AxisTitle.Text:=Series;
  E.Charts.Item[name].Axes[xlValue].AxisTitle.Text:=Value;
 except
  AxisChart:=false;
 end;
End;


Стены и основание диаграммы

Стены представляют собой вертикальные области, ограничивающие графическую часть диаграммы, и описываются через свойства и методы объекта Walls. Этот объект имеет такие свойства, как цвет и стиль окаймления, стиль и цвет (заливка) области стен. Функции управления этими свойствами смотрите в приложении (www.kornjakov.ru/st2_6.zip), а здесь рассмотрим их фрагменты.

Цвет, толщина и стиль рамки окаймления:

E.Charts.Item[name].Walls.Border.Color:=Color;
E.Charts.Item[name].Walls.Border.Weight:=Weight;
E.Charts.Item[name].Walls.Border.LineStyle:=LineStyle;

Цвет, рисунок и цвет рисунка заполнения стен:

E.Charts.Item[name].Walls.Interior.Color:=Color;
E.Charts.Item[name].Walls.Interior.Pattern:=Pattern;
E.Charts.Item[name].Walls.Interior.PatternColor:=PatternColor;

Заливка области стен из файла:

E.Charts.Item[name].Walls.Fill.UserPicture(PictureFile:=File_);
E.Charts.Item[name].Walls.Fill.Visible:=True;

Основание графической части диаграммы - область, ограничивающая диаграмму внизу. Она описывается через свойства и методы объекта Floor. Этот объект обладает аналогичными свойствами, как и область стен. Вот несколько примеров их настройки из приложений Delphi.

Цвет, толщина и стиль линий - границы основания:

E.Charts.Item[name].Floor.Border.Color:=Color;
E.Charts.Item[name].Floor.Border.Weight:=Weight;
E.Charts.Item[name].Floor.Border.LineStyle:=LineStyle;

Цвет, рисунок и цвет рисунка области основания:

E.Charts.Item[name].Floor.Interior.Color:=Color;
E.Charts.Item[name].Floor.Interior.Pattern:=Pattern;
E.Charts.Item[name].Floor.Interior.PatternColor:=PatternColor;

Заливка области основания из файла:

E.Charts.Item[name].Floor.Fill.UserPicture(PictureFile:=File_);
E.Charts.Item[name].Floor.Fill.Visible:=True;


Серии коллекции

Рассмотрим серии коллекции - графики, набор фигур на диаграмме. Доступ к коллекциям получаем через объект SeriesCollection. Количество их зависит от размеров области данных диаграммы на рабочем листе. Чтобы получить его значение, считаем поле Count объекта SeriesCollection. Функция SeriesCount (для работы в среде Delphi) возвращает количество серий.

Function SeriesCount (Name:variant):integer;
begin
 SeriesCount:=-1;
 try
  SeriesCount:=E.Charts.Item[name].SeriesCollection.Count;
 except
  SeriesCount:=-1;
 end;
End;

Рассмотрим вид коллекции - вид фигур в коллекции (куб, пирамида и др.). Я насчитал шесть видов. Для своих приложений можем использовать функцию BarShapeSeries для выбора любого из шести видов.

Function BarShapeSeries (Name:variant;series,BarShape:integer):boolean;
begin
 BarShapeSeries:=true;
 try
  E.Charts.Item[name].SeriesCollection.Item[series].BarShape:=BarShape;
 except
  BarShapeSeries:=false;
 end;
End;

Остальные параметры: параметры границы и областей коллекции аналогичны параметрам любых областей диаграммы. Привожу их краткий список в виде операторов для Delphi:

E.Charts.Item[name].SeriesCollection.Item[series].Border.Color:=Color;
E.Charts.Item[name].SeriesCollection.Item[series].Border.Weight:=Weight;
E.Charts.Item[name].SeriesCollection.Item[series].Border.LineStyle:=LineStyle;
E.Charts.Item[name].SeriesCollection.Item[series].Interior.Color:=Color;
E.Charts.Item[name].SeriesCollection.Item[series].Interior.Pattern:=Pattern;
E.Charts.Item[name].SeriesCollection.Item[series].Interior.PatternColor:=PatternColor;
E.Charts.Item[name].SeriesCollection.Item[series].Fill.UserPicture(PictureFile:=File_);
E.Charts.Item[name].SeriesCollection.Item[series].Fill.Visible:=True;

Мы рассмотрели только малую часть из того, что позволяет программировать процесс создания документа в Excel из приложений на Delphi. Ответы на остальные вопросы вы можете получить сами, например, методом изучения дополнительной литературы или методом проб и ошибок. В дальнейшем рассмотрим создание и варианты использования динамической библиотеки на базе наработанного материала. Полные исходные тексты с примерами смотрите по адресу www.kornjakov.ru/st2_6.zip. По всем вопросам можете обратиться к автору по адресу _kvn@mail.ru или www.kornjakov.ru.

Василий КОРНЯКОВ

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

Версия для печатиВерсия для печати

Номер: 

31 за 2003 год

Рубрика: 

Азбука программирования
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя Лукьянченко
Спасибо большое автору статьи за уникальные сведенья. Очень рад, что имел возможность с ними ознакомиться.
Аватар пользователя Алексей
Хочу также выразить огромную признательность автору статьи. Очень толковый и исчерпывающий материал на тему excel.application
Аватар пользователя Александр
Материал - супер! Респект!

Вопрос. Написал прогу для обработки эксель-файлов. Считываю информацию через Sheet.Cells[i,j]. Проблема в том, что медленно все это работает. Есть ли вариант загрузки сразу всего содержимого в VarArray из нужного диапазона (например, используя VarArrayLock)? Кое-что нашел в инете, но там как-то всё описано неграмотно и, естественно, не работает.

Заранее благодарю.