Шаг 170.
Автоматизация Microsoft Excel. Диаграммы в рабочей книге Excel.
Коллекция Charts

    На этом шаге мы рассмотрим создание диаграммы.

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


    Замечание. Диаграмма может располагаться на отдельном листе, поэтому доступ к ней может быть таким же, как к листу. Например: если диаграмма расположена на первом листе, то ее можно удалить как лист (оператор Application.ActiveWorkbook.Sheets.Item(l).Delete;) или как диаграмму (оператор Application.ActiveWorkbook.Charts.Item(l).Delete;). Результат будет одним и тем же.

    Для того чтобы создать новую диаграмму, а затем манипулировать общим списком диаграмм и получать доступ к отдельной диаграмме, достаточно воспользоваться одним свойством и двумя методами коллекции Charts. Свойство Count имеет тип Integer, его значение равно количеству диаграмм в рабочей книге. Метод Add создает новую диаграмму и возвращает ссылку на нее. Метод Item() возвращает ссылку на созданную ранее диаграмму, принадлежащую коллекции Charts. Аргументом метода Item() является порядковый номер (индекс) или имя диаграммы в коллекции. Во втором случае аргументом метода Item является строка, содержащая имя диаграммы. Индексом может быть целое число со значением в диапазоне от 1 до Charts.Count.

    Следующая процедура демонстрирует, как можно создать диаграмму, получив ссылку на нее, а ниже расположенная строка - как получить доступ к существующей диаграмме с помощью индекса.

    Chart:=E.Charts.Item[1];
procedure TForm1.Button3Click(Sender: TObject);
//Добавление диаграммы и получение ссылки на нее
var
  i:Integer;
const xl3DColumn=-4100;
      xlColumns=2;
begin
  Chart:=E.Charts.Add;
  Chart.ChartType:=xl3DColumn;
  Chart.SetSourceData(Source:=E.ActiveWorkbook.Sheets.Item['Лист1'].Range['A1:F5'],
     PlotBy:=xlColumns);
end;

    Результат выполнения процедуры, использующей метод Add, представлен на рисунке 1.


Рис.1. Диаграмма, созданная на отдельном листе

    Процедура состоит из трех операторов: первый создает диаграмму и возвращает ссылку нее, два других, используя полученную ссылку, определяют область значений для построения диаграммы и ее тип. Без этих двух операторов мы получили бы только пустую область диаграммы. Тип диаграммы определяется значением свойства ChartType объекта Chart, имеющим целый тип и выбираемым из нескольких десятков констант. Метод SetSourceData определяет диапазон данных (область ячеек) листа рабочей книги, по которым будет строиться диаграмма. Первый аргумент этого метода определяет адрес области, второй - порядок использования ячеек в заданной области.

    Приведем полный текст приложения.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, Spin, ExtDlgs, ExtCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  E:variant;
  Chart:Variant;
{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
//Создание объекта Excel и отображение окна
begin
  E:=CreateOleObject('Excel.Application');
  E.Visible:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
//Создание рабочей книги
begin
  E.WorkBooks.Add;
end;

procedure TForm1.Button3Click(Sender: TObject);
//Добавление диаграммы и получение ссылки на нее
var
  i:Integer;
const xl3DColumn=-4100;
      xlColumns=2;
begin
  Randomize;
  for i:=1 to 5 do
  begin
    E.ActiveSheet.Cells(1,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(2,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(3,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(4,i):=i*(1+Random(50));
    E.ActiveSheet.Cells(5,i):=i*(1+Random(50));
  end;
  Chart:=E.Charts.Add;
  Chart.ChartType:=xl3DColumn;
  Chart.SetSourceData(Source:=E.ActiveWorkbook.Sheets.Item['Лист1'].Range['A1:F5'],
     PlotBy:=xlColumns);
end;

end.
Текст этого приложения можно взять здесь (6,2 Кб).

    В заключение отметим, что помимо значения параметра PlotBy xlColumns, равного 2, можно использовать также константу xlRows, которая имеет значение 1.

    В следующей таблице приведены константы, определяющие тип диаграммы.

Таблица 1. Константы, определяющие тип диаграммы
Константа Значение
xl3DArea -4098
xl3DAreaStacked 78
xl3DAreaStacked100 79
xl3DBarClustered 60
xl3DBarStacked 61
xl3DBarStacked100 62
xl3DColumn -4100
xl3DColumnClustered 54
xl3DColumnStacked 55
xl3DColumnStacked100 56
xl3DLine -4101
xl3DPie -4102
xl3DPieExploded 70
xlArea 1
xlAreaStacked 76
xlAreaStacked100 77
xlBarClustered 57
xlBarOfPie 71
xlBarStacked 58
xlBarStacked100 59
xlBubble 15
xlBubble3DEffect 87
xlColumnClustered 51
xlColumnStacked 52
xlColumnStacked100 53
xlConeBarClustered 102
xlConeBarStacked 103
xlConeBarStacked100 104
xlConeCol 105
xlConeColClustered 99
xlConeColStacked 100
xlConeColStacked100 101
xlCylinderBarClustered 95
xlCylinderBarStacked 96
xlCylinderBarStacked100 97
xlCylinderCol 98
xlCylinderColClustered 92
xlCylinderColStacked 93
xlCylinderColStacked100 94
xlDoughnut -4120
xlDoughnutExploded 80
xlLine 4
xlLineMarkers 65
xlLineMarkersStacked 66
xlLineMarkersStacked100 67
xlLineStacked 63
xlLineStacked100 64
xlPie 5
xlPieExploded 69
xlPieOfPie 68
xlPyramidBarClustered 109
xlPyramidBarStacked 110
xlPyramidBarStacked100 111
xlPyramidCol 112
xlPyramidColClustered 106
xlPyramidColStacked 107
xlPyramidColStacked100 108
xlRadar -4151
xlRadarFilled 82
xlRadarMarkers 81
xlStockHLC 88
xlStockOHLC 89
xlStockVHLC 90
xlStockVOHLC 91
xlSurface 83
xlSurfaceTopView 85
xlSurfaceTopViewWireframe 86
xlSurfaceWireframe 84
xlXYScatter -4169
xlXYScatterLines 74
xlXYScatterLinesNoMarkers 75
xlXYScatterSmooth 72
xlXYScatterSmoothNoMarkers 73

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг