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