Страницы

Поиск по вопросам

понедельник, 18 февраля 2019 г.

Как задать left position диаграммы во время экспорта в excel?

Делаю отчет в Excel-е с диаграммой на delphi. У него фиксированная позиция:
chart := sheet.chartobjects.add(270,205,397,220);
Как сделать, чтоб диаграмма началась с нужной мне колонки?


Ответ

Амирхон, чтобы вам проще было работать в Delphi (да и в других программах) с офисными продуктами, постарайтесь разобраться в иерархии объектов. Как только вы разберетесь, многие вещи сразу станут понятны. Я не могу посоветовать вам какую-то конкретную книгу, поскольку сам когда-то разбирался методом научного тыка, но, возможно, кто-то другой посоветует.
Хороший тон - использовать инструменты разработчика, они очень сильно помогают. В офисе 2003 и ранее - это запись макросов с последующим их анализом, позже - то же самое + использование вкладки Разработчик (её необходимо предварительно включить в настройках).
Итак, Chart входит в семейство Shapes, которое принадлежит Sheet (принадлежащий, в свою очередь, Book). Фишка в том, что к одному и тому же объекту можно обратиться по-разному, OLE это позволяет. И тот факт, что у каждого программиста есть свои любимые подходы, порождает массу непонятного. Но стоит прочувствовать иерархию, всё становится на свои места.
У меня подход несколько иной, чем у вас. Я вначале определяю объект, а уже затем задаю его свойства. На мой взгляд, так удобнее. Допустим, мы создали лист в Excel и заполнили несколько ячеек для диаграммы данными:
Excel:=CreateOleObject('Excel.Application'); Excel.Visible:=True; Book:=Excel.Workbooks.Add; // мне не жалко переменных для каждого объекта Sheet:=Book.Worksheets[1]; // поскольку дальше проще работать for i := 1 to 5 do begin Sheet.Cells[i, 1].FormulaR1C1:=i; Sheet.Cells[i, 2].FormulaR1C1:=cos(i); // пусть будет косинус end;
Все переменные здесь - OleVariant. Теперь создаем диаграмму:
ch:=Sheet.Shapes.AddChart;
Я специально выбрал для диаграммы переменную ch, а не chart, поскольку у диаграммы несколько уровней свойств, в том числе и свойство Chart, многие начинающие путаются в этом. Далее:
Ch.Name := 'График 1'; // обзовём диаграмму так Ch.Chart.ChartType := xlLineMarkers; // тип диаграммы
Типы диаграмм мы обсуждали в Как правильно задать тип chart-а c помощью delphi. Либо вы поступаете так, как я порекомендовал, либо можно использовать один из встроенных модулей Delphi, например, ExcelXP или Excel2010, в которых эти константы определены. Отмечу, что, чтобы изменить некоторые свойства диаграммы, например, название, я обращаюсь непосредственно к переменной ch, а вот для работы с графиком я должен уже обращаться к свойству Chart
Ну, а теперь вернемся к нашему основному вопросу. Изменим координаты. Координаты - свойства непосредственно диаграммы, это Left и Top. Задаются они в пикселях, причём только для левого верхнего угла, а правый нижний уже определяется Width и Height (шириной и высотой, причём, как правило, в долях экрана, а не в пикселях). Так как вам нужно поместить диаграмму не в координатах пикселей, а в координатах ячеек, то нам нужно вначале их рассчитать:
Ch.Left := Sheet.Range['A1:D1', EmptyParam].Width + 2; Ch.Top := Sheet.Range['E1:E3', EmptyParam].Width + 2;
Я поместил, таким образом, свою диаграмму в ячейку E4, сместив её край на 2 пикселя. Кстати, тот же самый результат можно получить по-другому:
Ch.Left := Sheet.Range['E4', EmptyParam].Left + 2; Ch.Top := Sheet.Range['E4', EmptyParam].Top + 2;
Что ещё раз демонстрирует разные подходы.

Комментариев нет:

Отправить комментарий