Страницы

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

четверг, 9 января 2020 г.

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

#delphi #excel #vba #chart #диаграммы


Делаю отчет в Excel-е с диаграммой на delphi.
У него фиксированная позиция:  

chart := sheet.chartobjects.add(270,205,397,220);


Как сделать, чтоб диаграмма началась с нужной мне колонки?
    


Ответы

Ответ 1



Амирхон, чтобы вам проще было работать в 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; Что ещё раз демонстрирует разные подходы.

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

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