Delphi построить график в excel
Делаю отчет в Excel-е с диаграммой на delphi.
У него фиксированная позиция:
Как сделать, чтоб диаграмма началась с нужной мне колонки?
1 ответ 1
Амирхон, чтобы вам проще было работать в Delphi (да и в других программах) с офисными продуктами, постарайтесь разобраться в иерархии объектов. Как только вы разберетесь, многие вещи сразу станут понятны. Я не могу посоветовать вам какую-то конкретную книгу, поскольку сам когда-то разбирался методом научного тыка, но, возможно, кто-то другой посоветует.
Хороший тон - использовать инструменты разработчика, они очень сильно помогают. В офисе 2003 и ранее - это запись макросов с последующим их анализом, позже - то же самое + использование вкладки Разработчик (её необходимо предварительно включить в настройках).
Итак, Chart входит в семейство Shapes , которое принадлежит Sheet (принадлежащий, в свою очередь, Book ). Фишка в том, что к одному и тому же объекту можно обратиться по-разному, OLE это позволяет. И тот факт, что у каждого программиста есть свои любимые подходы, порождает массу непонятного. Но стоит прочувствовать иерархию, всё становится на свои места.
У меня подход несколько иной, чем у вас. Я вначале определяю объект, а уже затем задаю его свойства. На мой взгляд, так удобнее. Допустим, мы создали лист в Excel и заполнили несколько ячеек для диаграммы данными:
Все переменные здесь - OleVariant . Теперь создаем диаграмму:
Я специально выбрал для диаграммы переменную ch, а не chart, поскольку у диаграммы несколько уровней свойств, в том числе и свойство Chart, многие начинающие путаются в этом. Далее:
Типы диаграмм мы обсуждали в Как правильно задать тип chart-а c помощью delphi. Либо вы поступаете так, как я порекомендовал, либо можно использовать один из встроенных модулей Delphi, например, ExcelXP или Excel2010 , в которых эти константы определены. Отмечу, что, чтобы изменить некоторые свойства диаграммы, например, название, я обращаюсь непосредственно к переменной ch, а вот для работы с графиком я должен уже обращаться к свойству Chart .
Ну, а теперь вернемся к нашему основному вопросу. Изменим координаты. Координаты - свойства непосредственно диаграммы, это Left и Top . Задаются они в пикселях, причём только для левого верхнего угла, а правый нижний уже определяется Width и Height (шириной и высотой, причём, как правило, в долях экрана, а не в пикселях). Так как вам нужно поместить диаграмму не в координатах пикселей, а в координатах ячеек, то нам нужно вначале их рассчитать:
Я поместил, таким образом, свою диаграмму в ячейку E4, сместив её край на 2 пикселя. Кстати, тот же самый результат можно получить по-другому:
Сегодня мы рассмотрим один из наиболее интересных, на мой взгляд, моментов работы с Excel в Delphi — построение диаграмм.
Забегая немного вперед, скажу, что есть несколько способов добавления диаграммы в рабочую книгу Excel. Чтобы все статьи по вопросам автоматизации Excel в блоге были как-то логически связаны, я решил сегодня рассмотреть способ добавления диаграммы через объект ChartObjects, с которым мы встречались, когда разбирали методы объекта WorkSheet.
План статьи:
Итак, поставим перед собой цель — построить простой линейный график на основании данных таблицы (StringGrid) нашего приложения. При этом, чтобы продолжить предыдущую тему, постараемся скопировать таблицу на лист один-к-одному.
1. Копируем данные из таблицы и оформление StringGrid.
Для копирования данных из таблицы на лист Excel воспользуемся простейшей процедурой, которую мы уже с Вами рассматривали. Для наглядности, приведу листинг процедуры ещё раз:
Теперь начнем копировать оформление. Во-первых, необходимо определить свойство BorderStyle у StringGrid — оно может быть либо bsSingle либо bsNone. В первом случае внешние границы таблицы будут выделяться. Отсюда следует, что и наша таблица в Excel должна иметь окантовку. Делается это просто:
Во-вторых, StringGrid может быть с отрисованными внутренними линиями и без них. За отрисовку внутренних линий отвечают два параметра из свойства Options у StringGrid: goFixedVertLine (прорисовка вертикальных линий в ) и goFixedHorzLine (прорисовка горизонтальных линий в StringGrid).
Проверяем наш StringGrid и, в случае необходимости, прорисовываем внутренние границы ячеек:
А теперь самое интересное — определение цветов StringGrid и перенос их в таблицу Excel. Для того, чтобы перевести цвет в Delphi в цвет, приемлемый для Excel, напишем небольшую подпрограмму:
где Color — это любой из цветов в Delphi, например clRed или clBtnFace. В итоге мы получим три составляющих для RGB, который допускается использовать при заливке ячеек в Excel.
Теперь можно копировать цвета фиксированных ячеек StringGrid:
Таким образом мы скопировали наш StringGrid на лист Excel. Конечно, здесь есть свои недостатки, например StringGrid может быть раскрашен как новогодняя ёлка или иметь совершенно иное оформление, чем стандартное и тогда, следуя вышеперечисленным операциям Вы не добьетесь копирования оформления один-к-одному. Но, при небольшом дополнении исходного кода этого можно легко добиться — суть вопроса остается той же, как и набор операций работы Delphi с Excel.
2. Добавление и редактирование диаграммы Excel
Теперь, имея в своем распоряжении данные, можно приступать к построению диаграммы Excel с помощью Delphi.
Для того, чтобы добавить в коллекцию ChartObjects новый объект необходимо выполнить метод Add:
Left и Top — начальные координаты нового объекта (в пикселях), относительно левого верхнего угла ячейки A1 на листе или в левом верхнем углу графика.
Width и Height — соответственно ширина и высота новой диаграммы.
В результате выполнения метода в коллекцию ChartObjects добавляется новый объект. Пока никаких данных объект не использует. По сути в добавляется пустой холст диаграмм Excel.
Для того, чтобы построить диаграмму, необходимо:
- получить ссылку на объект Chart из коллекции ChartObjects;
- воспользоваться методом ChartWizard
Чтобы получить ссылку на вновь добавленный объект необходимо выполнить следующую операцию:
Метод ChartWizard содержит следующие параметры:
Параметр | Тип | Описание |
Source | Variant | диапазон, который содержит исходные данные для нового графика |
Gallery | integer | (Enumerations xlChartType) — тип диаграммы. Для метода ChartWizard может принимать следующие значения: xlArea, xlBar, xlColumn, xlLine, xlPie, xlRadar, xlXYScatter, xlCombination, xl3DArea, xl3DBar, xl3DColumn, xl3DLine, xl3DPie, xl3DSurface, xlDoughnut, xlDefaultAutoFormat |
Format | integer | (1..10) — может быть числом от 1 до 10, в зависимости от типов галереи. Если этот аргумент опущен, Microsoft Excel выбирает значение по умолчанию в зависимости от типа диаграммы и источника данных. Например Format = 5 для нашего случая заставит Excel прорисовать на диаграмме линии сетки. |
PlotBy | определяет каким образом данные располагаются в Source. Может принимать два значения xlColumns = 2 (данные расположены в столбцах) xlRows = 1 (данные расположены в строках) | |
CategoryLabel | integer | определяет номер строки или столбца в пределах источника, содержащим метку категории. Допустимые значения от 0 (ноль) до предпоследнего номера столбца или строки источника |
SeriesLabels | integer | определяет номер строки или столбца в пределах источника, содержащим метку набора данных |
HasLegend | boolean | определяет будет ли на диаграмме Excel отражена легенда |
Title | string | заголовок диаграммы Excel |
CategoryTitle | string | подпись оси категорий |
ValueTitle | string | подпись оси значений |
ExtraTitle | string | дополнительная подпись оси при построении трехмерных графиков |
Как и для любых других методов Excel, в Delphi допускается опускать некоторые параметры или отмечать их как EmptyParam.
Теперь построим наш график. Для этого я написал небольшую процедуру:
Как видите, все достаточно просто. Берется таблица StringGrid, данные из неё переносятся в Excel на активный лист и, затем, эти данные используются для построения графика. Причём первая ячейка таблицы используется для подписи рядов данных. В результате выполнения процедуры я получил следующую диаграмму Excel:
Ну, и наконец, для того, чтобы представить этот же график в объемном виде, воспользуемся одним из многочисленных свойств объекта Chart — ChartType:
в итоге получим следующий вид диаграммы:
На сегодня все :) В следующий раз займемся свойствами объекта Chart, научимся строить различные типы диаграмм и изменять область построения диаграммы. А пока можете поэкспериментировать с параметрами у ChartWizard и посмотреть какие ещё виды диаграмм Excel Вы сможете построить в Delphi.
Предыдущая статья на тему работы с Excel в Delphi — «Excel в Delphi. Методы объекта WorkSheet (лист).«
Следующая статья на тему работы с Excel в Delphi — »Excel в Delphi. Работа с объектом Range (диапазон)«
Книжная полка
Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.
Раз уж целью стало найти компоненты, с которыми размер exe-файла будет минимальным, то сразу создадим в Delphi XE6 два проекта:
- с использованием TChart
- с использованием RiverSoftAVG Charting Component Suite
и проверим который из exe-файлов будет «толще». Для примера я решил в обоих примерах построить обычные линейные графики. Чтобы было нагляднее, размеры exe-файлов представим, опять же, в виде простенькой столбчатой диаграммы:
Как можно видеть, с компонентом RiverSoftAVG готовый exe-файл «весит» почти на 700 Кб меньше, чем при использовании TChart. Много это или мало? Думаю — нормально :)
Теперь посмотрим, какие графики и диаграммы можно строить с помощью этих компонентов. Вот, что мы можем увидеть на палитре компонентов:
Всего RiverSoftAVG Charting Component Suite содержит 26 различных компонентов только для графиков и диаграмм. Здесь есть и как уже привычные нам столбчатые диаграммы, «пироги», линейные графики, так и довольно необычные типы, например, построение звездообразной диаграммы, построение диаграмм типа «chart-in-chart», т.е. когда на подложке, например, карты мира вы можете размещать круговые или столбчатые диаграммы. Наиболее ярким примером возможностей компонентов RiverSoftAVG Charting на мой взгляд может послужить компонент TRSPathChart, используя который, можно выстраивать различные фигуры (по аналогии компонента TPath в FMX о котором я немного рассказывал). Вот, например, как выглядит демка с этим компонентом:
Данные о границах штатов читаются из обычного SVG-файла, каждому штату, соответственно присваивается свой цвет. Вот как выглядит код для чтения SVG:
Собственно, это и есть весь код программы, демонстрирующей работу компонента TRSPathChart. В целом компоненты достаточно функциональные и в чем-то даже превосходят обычный Tee Chart, которые, к тому же, предоставляются нам бесплатно только в виде Lite-версии, т.е. без исходного кода. Так что, если вам вдруг когда-то понадобятся компоненты для рисования графиков и диаграмм в Delphi 2010 — XE6 или Appmethod и, к тому же, бесплатные для некоммерческого использования, то обратите внимание на RiverSoftAVG Charting Component Suite.
Ссылка на официальный сайт разработчика.
Книжная полка
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
Описание: Книга рассчитана на подготовленного пользователя ПК, желающего самостоятельно научиться программировать и разрабатывать приложения и базы данных в среде Delphi. Опытные программисты смогут использовать издание как справочник. В тексте подробно описаны более 80 компонентов VCL, функции Object Pascal и Win32 API.
На этой странице представлена подборка статей, посвященные работе с Excel в Delphi. Все статьи расположены по порядку изложения материала в блоге, то есть от самых основ работы с Excel в Delphi до выполнения сложных операций, вставки диаграмм в книгу и так далее.
Работа с Excel в Delphi. Основы основ
Это вводная статья по работе с excel в delphi, которая поможет вам разобраться с основами по взаимодействия вашего приложения Delphi и Microsoft Excel. В статье рассмотрены следующие вопросы:
Excel в Delphi. Методы объекта WorkSheet (лист)
В статье рассмотрены вопросы о том, как можно работать с листами рабочей книги, изменять внешний вид ячеек, копировать таблицу из своего приложения Delphi в открытую рабочую книгу:
Диаграммы Excel в Delphi. Общие сведения
В статье рассмотрен способ добавления диаграммы в лист Excel через объект ChartObjects. План статьи следующий:
Excel в Delphi. Работа с объектом Range (диапазон)
Статья дает более полное представление о том, как можно работать с данными листа Excel в Delphi, используя объект Range (диапазон). Рассмотрены свойства и методы объекта range. План статьи:
Excel в Delphi. Как изменить внешний вид ячеек?
В статье рассматриваются вопросы оформления ячеек таблицы Excel в Delphi:
Полная автоматизация. Редактируем объекты Excel, содержащиеся в документах Word и наоборот
В статье рассматривается достаточно нетривиальный вопрос: как добраться до диаграммы Excel, внедренной в документ Word и работать с ней в Delphi? Статья состоит из трех частей:
Быстрая обработка данных Excel в Delphi
Эта статья раскрывает вопросы, касающиеся быстрой обработки данных при работе с Excel в Delphi. Одной из проблем, с которой сталкиваются начинающие разработчики, является то, что рассмотренные в предыдущих статьях методы чтения/записи данных в Excel работают очень медленно при большом количестве данных. Статья позволяет понять то, как сократить время операций при работе с Excel в Delphi в несколько раз, используя вариантные массивы и библиотеку XLSReadWrite.
Пост-ответ. Работа с примечаниями в Excel
В статье рассматривается то, как, используя Delphi вставлять и редактировать примечания в ячейках Excel. План статьи:
Excel в Delphi. Работа со свойствами документа
Статья раскрывает вопросы изменения свойств документа Excel в Delphi и состоит из трех частей:
Создаем свои контролы на ленте Microsoft Office
Небольшая заметка о том, как получить доступ у ленте Excel и добавить на неё свою кнопку.
Эти и другие статьи, посвященные работе с Excel в Delphi вы всегда сможете найти в блоге по тегу Excel в Delphi
Книжная полка
Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.
Я заполнил несколько ячеек Excel данными, а теперь не могу на их основе сделать диаграмму. Ругается на тип Chart и на xlColumns. Что не так? И можно ли заполнять ячейки данными через цикл?
@KromStern, а можете показать валидный код? Писал код по учебнику, и не понимаю как решить этот вопрос
2 ответа 2
Поскольку этот вопрос перекликается с предыдущим в плане навыков программной работы с приложениями MSOffice (да и вообще с COM-объектами), попробую объяснить порядок составления своего Delphi-кода на основе VBA. Напоследок отложим непосредственно ответ на сам вопрос.
Во-первых, нужно представлять себе иерархию объектов MS Office-приложения. В Excel она несколько проще, чем в Word.
Собственно, по большому счету все. Остальное запоминать не обязательно, потому что мощным помощником выступает сам Excel/Word, позволяя записывать все "ручные" действия пользователя в макросы.
Приступим. Первый этап - размещение данных на нужном листе. Здесь пользуемся приведенной ранее иерархией:
Замечательно то, что большинство свойств принимает тип Variant, то есть - практически любые значения: строки, integer, Double и т.п.
Есть несколько способов задать значение ячейке: Formula , FormulaR1C1 , Value , etc. Нужно понимать их различия и пользоваться необходимыми соответственно задаче. Чаще всего используются именно Formula и FormulaR1C1
Так же полезно понимать, что каждая ячейка на самом деле это объект Range, то есть представляет собой любое, произвольное количество ячеек и работа с несколькими ячейками из состава Range не отличается от работы с одной ячейкой, полученной через Cells .
Далее необходимо на лист добавить график. Мы не знаем, как это сделать, да и из-за однократности задачи помнить, где этот график находится в иерархии объектов - расточительно.
Заходим в меню "Вид", нажимаем "Макросы - Запись макроса" и нажимаем "ОК". Переходим на вкладку "Вставка" и добавляем простую гистограмму. Далее выбираем дипазон данных (я взял B1-B5 ), изменяем подписи (выбрал A1-A5 ) подтверждаем изменения и останавливаем запись макроса ("Вид" - "Макросы" - "Остановить запись"). Теперь осталось войти внутрь макроса ("Вид" - "Макросы" - "Макросы"-"Изменить"). Должен получиться примерно такой код VBA:
И вот тут нам понадобится справка, потому что дальше не все так тривиально. Разберем по строчкам:
ActiveSheet.Shapes.AddChart.Select - последний метод ( Select ) нас не интересует, поскольку он просто выделяет добавленную фигуру на листе. Для программной работы выделение объекта излишне. А вот AddChart добавляет объект Shape , а нам нужен объект Chart. VBA дальше идет по пути наименьшего сопротивления - использует свойство Application.ActiveChart ( ActiveChart.ChartType = xlColumnClustered и т.п.). Но нам это не подходит, поскольку (повторюсь) при программной работе с Excel нежелательно использовать "активные элементы", нужно работать именно с тем, что мы добавили. Выясняем, что у объекта Shape есть свойство Chart, именно оно нам нужно. Соответственно, всю дальнейшую работу строим именно на этом, переводя код VBA в Delphi:
Здесь следует обратить внимание, что мы избегаем называть возможно локализованное имя листа (оно может зависеть от языка Office, пользователь может его переименовать и т.п.). Поэтому берем реальное наименование из свойства Sheet.Name.
Вот и все. Полный получившийся код:
В заключение замечание по поводу используемых констант xlColumnClustered и подобных: можно подключить в uses модуль Excel2010 , ExcelXP или другой, имеющийся в вашей версии Delphi. Но можно и подставлять значения констант вручную, через поиск в Google (лучше брать ссылки на первоисточник - microsoft). Например, поиск по xlColumnClustered первой же ссылкой дает перечень констант XlChartType Enumeration
Читайте также: