Excel.Chart ожидание отрисовки графика

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Excel.Chart ожидание отрисовки графика

Сообщение VERITAS » 19.04.2012 (Чт) 12:12

Добрые день уважаемые форумчане.

Работая с объектной моделью Excel столкнулся с такой проблемой:
Создаю график, назначаю ряды (Series). Далее у 3х из шести Series включаю отображение подписей DataLabel.
Код: Выделить всё
ChartObjects('chart1").Chart.SeriesCollection(..).Points(..).DataLabel.Position = Excel.XlDataLabelPosition.xlLabelPositionRight

Далее, в связи со специфичной задачей, настраиваю положение надписи каждой точки Point в коллекции DataLabel относительно друг друга, так чтобы они не пересекались друг с другом на графике.
Но тут такой момент, что пока Excel не отрисует эти подписи на графике и не настроит их положении, работать с ними нельзя, так как часть из них еще не создана, другие имеют пока еще не верные координаты.
При том при всем заставить график их отрисовать немедленно и ожидать завершения этой операции с помощью объектной модели и предоставляемых ею методов нельзя.
Единственное пока работающее решение которое я применил это использование
1. функции экспорта Chart в файл (заставляет график "начинать" отрисоваться немедленно)
2. делаю задержку, чтобы подождать отрисовку точек и назначения им соответствующих свойств - Sleep(1000) - эксперементальное значение
В итоге получаю 3 графика на листе x (до 50 листов) ~ 3x50x1000 = 150 секунд простоя. Что в целом очень критично для быстродействия (+ ко времени накручивается работа с COM).

Может кто знает как отловить окончание отрисовки графика, были бы эвенты у Chart (Draw, Redraw, Paint)?
No comments ...

Sam777e
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 157
Зарегистрирован: 16.09.2010 (Чт) 4:33

Re: Excel.Chart ожидание отрисовки графика

Сообщение Sam777e » 20.04.2012 (Пт) 20:20

К сожалению, нет времени. И, если копаться и пробовать, то нужно больше подробностей относительно Вашего кода.

А навскидку:
1. Не спеша создать свой Template , где все заранее сделано; но, если у Вас ситуация сильно зависит от данных, то смотри выше

2. Excel Developer Reference писал
Chart.Calculate Event
Occurs after the chart plots new or changed data, for the Chart object.
Syntax

expression.Calculate

expression A variable that represents a Chart object.

В 1-ый раз у нас вроде как раз NEW ?

3. Property ShowValue As Boolean
Member of Excel.DataLabel
Сначала Запретить, а потом Разрешить
Здоровья и удачи

VERITAS
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 212
Зарегистрирован: 12.12.2004 (Вс) 20:31

Re: Excel.Chart ожидание отрисовки графика

Сообщение VERITAS » 23.04.2012 (Пн) 13:30

1. Template используется. В нем и сохранены настройки графика (маркеры, цвета, подписи). И Вы совершенно правы, ситуация зависит от данных.
2. Событие Calculate вызывается когда изменяются непосредственные данные, на которых строится график. Еще есть событие SeriesChange но оно к сожалению не работает. Не подходит.
3. Используется, - ситуацию не меняет, хотя изначально в шаблоне отображение подписей включено.

Суть кода в следующем:
1. Повторное включение отображения подписей с права от точки
2. Определение мертвых точек (без значений), определение ширины и высоты текста подписи, вычисление отностельного положения -> заполнение массива точек
3. Сортировка серий (линий) в порядке убывания сверху-вниз, относительно положения на графике
4. Вычисление нового положения подписи относительно размеров PlotArea (подписи не должны выходить за границы PlotArea, и не должны накладываться друг на друга).
5. Изменение положения подписей.

Вставлять код в сообщение не буду, дабы не захломлять тему. Прикрепляю к сообщению тестовый проект.
SortSpot.rar
Пример, приблизительно показывающий принцип работы кода (на реальных данных и графиках размера A3 все гораздо лучше, так как параметры настроены для определенных размеров графиков, поэтому код не стремится к универсализму
(22.68 Кб) Скачиваний: 178

Примечание1: попробуйте закоментировать в процедуре SortSpotVBA
ch.Export(System.Environment.CurrentDirectory & "\temp.png", "PNG", False)
Thread.Sleep(1000)

Примечание2: Если не выключать XL.ScreenUpdating то ситуация неким образом меняется, но время выполнения увеличивается в разы, так, что хуже становится.
No comments ...


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 32

    TopList