crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Excel графики в Qt , нужна помощь
Гость_diadia_sid_*
сообщение 16.2.2017, 16:48
Сообщение #1





Гости








    


Доброго времени суток.

Пишу программу для переноса данных из текстового файла в Excel. Возникла проблема с графиками. При создании нового графика создается новый лист. Как перенести график на основной лист с данными?

Код:

range = worksheet->querySubObject("Range(const QVariant&)", QVariant("A2:C200"));
range->dynamicCall("Select()");
//Создаем объект Charts (коллекция областей диаграмм)
QAxObject * charts = workbook->querySubObject("Charts");
//Добавляем новую область диаграмм
QAxObject * chart = charts->querySubObject("Add()");
//Устанавливаем имя области диаграмм
chart->dynamicCall("Name", "Name");
//Устанавливаем тип области диаграмм
chart->dynamicCall("ChartType", QVariant("xlLine"));
//Получаем доступ к текущему ряду области диаграмм
QAxObject * series = chart->querySubObject("SeriesCollection(const QVariant&)", QVariant(1));
//Устанавливаем имя ряда
series->dynamicCall("Name", "Name1");
//Получаем объект Range для оси X в виде QVariant
QVariant source = worksheet->dynamicCall("Range(const QVariant&)", QVariant("D2:D200"));
//Устанавливаем диапазон значаний X для ряда
series->dynamicCall( "XValues", source );
//Получаем объект Range для оси Y в виде QVariant
source = worksheet->dynamicCall("Range(const QVariant&)", QVariant("A2:A200"));
//Устанавливаем диапазон значаний Y для ряда
series->dynamicCall("Values", source);
series = chart->querySubObject("SeriesCollection(const QVariant&)", QVariant(2));
series->dynamicCall("Name", "Name2");
source = worksheet->dynamicCall("Range(const QVariant&)", QVariant("D2:D200"));
series->dynamicCall("XValues", source);
source = worksheet->dynamicCall( "Range(const QVariant&)", QVariant("B2:B200"));
series->dynamicCall("Values", source);
series = chart->querySubObject("SeriesCollection(const QVariant&)", QVariant(3));
series->dynamicCall("Name", "Name3");
source = worksheet->dynamicCall("Range(const QVariant&)", QVariant("D2:D200"));
series->dynamicCall("XValues", source);
source = worksheet->dynamicCall("Range(const QVariant&)", QVariant("C2:C200"));
series->dynamicCall("Values", source);

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.2.2017, 17:22
Сообщение #2


Мастер
******

Группа: Модератор
Сообщений: 3334
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 226 раз(а)




Репутация:   41  


Подсмотреть как это делают макросы Excel.
Я давным давно это делал так:
1. Включаешь запись макроса
2. Переносишь график на нужный тебе лист
3. Выключаешь запись макроса
4. Смотришь что там нагенерировалось в записанном макросе и переносишь это на Qt

Обычно там удобочитаемый код, который можно без проблем применить в Qt
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_diadia_sid_*
сообщение 16.2.2017, 17:53
Сообщение #3





Гости








    


Цитата(ViGOur @ 16.2.2017, 17:22) *
Подсмотреть как это делают макросы Excel.
Я давным давно это делал так:
1. Включаешь запись макроса
2. Переносишь график на нужный тебе лист
3. Выключаешь запись макроса
4. Смотришь что там нагенерировалось в записанном макросе и переносишь это на Qt

Обычно там удобочитаемый код, который можно без проблем применить в Qt


Спасибо за участие.
Сам пользуюсь этим методом. Но вот в данном случае не получилось воплотить в рабочий код Qt =(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 17.2.2017, 9:07
Сообщение #4


Мастер
******

Группа: Модератор
Сообщений: 3334
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 226 раз(а)




Репутация:   41  


Что именно не получается?
У меня просто нет винды под рукой, чтобы посмотреть что там и как.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.2.2017, 9:09
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2920
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 202 раз(а)




Репутация:   35  


Цитата(ViGOur)
Обычно там удобочитаемый код, который можно без проблем применить в Qt

ну уж нет, обычно код в макросе - лишь набор намёков (но уже и за это спасибо), а вот настоящий крепкий секс начинается уже при работе с QAxObject :D

Сообщение отредактировал Алексей1153 - 17.2.2017, 9:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_diadia_sid_*_*
сообщение 17.2.2017, 10:56
Сообщение #6





Гости








    


Цитата(Алексей1153 @ 17.2.2017, 9:09) *
Цитата(ViGOur)
Обычно там удобочитаемый код, который можно без проблем применить в Qt

ну уж нет, обычно код в макросе - лишь набор намёков (но уже и за это спасибо), а вот настоящий крепкий секс начинается уже при работе с QAxObject :D


Полностью согласен :lol: У меня с переносом графика секс закончился ничем :unsure:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_diadia_sid_*_*
сообщение 17.2.2017, 10:59
Сообщение #7





Гости








    


Цитата(ViGOur @ 17.2.2017, 9:07) *
Что именно не получается?
У меня просто нет винды под рукой, чтобы посмотреть что там и как.


Не получается перенести получившийся график (находящийся на Лист_с_графиком (при создании нового графика создается новый лист с ним (Лист_с_графиком))) на Лист_с_данными.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.2.2017, 11:04
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2920
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 202 раз(а)




Репутация:   35  


мне эксель выдал такую подсказку , попробуй. Обрати внимание на константы - через QAxObject частенько только в виде чисел они прокатывают
Sub Макрос1()
    Range("B3:E18").Select
    Charts.Add
    
    'xlColumnClustered== 51
    ActiveChart.ChartType = xlColumnClustered
    
    ActiveChart.SetSourceData Source:=Sheets("Лист1").Range("B3:E18")
    
    'xlLocationAsObject== 2
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Лист1"
End Sub
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
diadia_sid
  опции профиля:
сообщение 22.2.2017, 12:26
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 21.2.2017
Пользователь №: 4715

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 18.2.2017, 11:04) *
мне эксель выдал такую подсказку , попробуй. Обрати внимание на константы - через QAxObject частенько только в виде чисел они прокатывают
Sub Макрос1()
    Range("B3:E18").Select
    Charts.Add
    
    'xlColumnClustered== 51
    ActiveChart.ChartType = xlColumnClustered
    
    ActiveChart.SetSourceData Source:=Sheets("Лист1").Range("B3:E18")
    
    'xlLocationAsObject== 2
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Лист1"
End Sub


Спасибо за ответ.
Сам получал такой ответ через запись макроса Excel.
И мне не удается перевезти этот код в код Qt. :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.2.2017, 14:55
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2920
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 202 раз(а)




Репутация:   35  


diadia_sid, вот так прокатывает

//----------------------------------------------
//Создаем объект Charts (коллекция областей диаграмм)
QAxObject * charts = workbook->querySubObject("Charts");
//Добавляем новую область диаграмм
QAxObject * chart = charts->querySubObject("Add()");

auto* range = worksheet->querySubObject("Range(const QVariant&)", QVariant("A2:C200"));
chart->dynamicCall("SetSourceData(const QVariant&)", range->asVariant());

//'xlLocationAsObject== 2
auto listname = worksheet->property("Name");
chart->dynamicCall("Location(const QVariant&,const QVariant&)",QVariant(2), listname );

//'xlColumnClustered== 51
chart->dynamicCall("ChartType(const QVariant&)", QVariant(51));
//----------------------------------------------

//Устанавливаем имя области диаграмм
chart->dynamicCall("Name", "Name");

//...



Кстати, я себе для удобства сделал обёртки QAxObject - с RAII и без аллергии на обращение по нулевому указателю - позволяет избежать многоэтажных проверок и вложенностей кода )

Сообщение отредактировал Алексей1153 - 23.2.2017, 14:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.3.2017, 13:03