Шаг 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.
Следующая процедура демонстрирует, как можно создать диаграмму, получив ссылку на нее, а ниже расположенная строка -
как получить доступ к существующей диаграмме с помощью индекса.
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 |
На следующем шаге мы продолжим изучение этого вопроса.
Предыдущий шаг
Содержание
Следующий шаг