Russian Qt Forum
Ноябрь 22, 2024, 19:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt4 + графики Excel  (Прочитано 18258 раз)
bigirbis
Гость
« : Август 30, 2006, 14:50 »

Народ, помогите! Попадалово страшное.
Приложение писано на Qt4.1.1. Все графики выводятся с использованием QWt. Однако, как оказалось, отчеты заказчик хочет видеть в Excel, при чем, такие, какие он делает на текущий момент вручную, один в один.
Кто-нибудь решал подобную задачу?
Все более-менее нормальные ссылки (судя по многообещающему названию) битые. Отдампить с помощью dumpcpp не получилось. Может руки не оттуда растут?
Да, и еще, линии строятся не по точкам, а с помощью тренда.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Август 30, 2006, 15:55 »

в Qt4 есть поддержка ActiveX

как работать в Excel + ActiveX ссылок полно в инете!
я в свое время тоже этим развлекался
Записан
bigirbis
Гость
« Ответ #2 : Август 31, 2006, 08:36 »

Дело в том, что я не осилил начальный этап:
dumpcpp -n Excel Excel.Application
возвращает мне ошибку:
dumpcpp: type library '' not found
Где накосячил(никаких файликов, естественно, не создается)?

Осилил: для генерации врапера по Excel надо было втоптать следующее:
dumpcpp -n Excel Excel.Addin
Записан
bigirbis
Гость
« Ответ #3 : Сентябрь 04, 2006, 14:24 »

Кто осилит: "почему range = 0"? Грустный
Код:

application = new Excel::Application( this );
Q_ASSERT( application != 0 );
if( !application ) return;
application->SetSheetsInNewWorkbook( 1 );

Excel::Workbook * workbook = application->Workbooks()->Add( Excel::xlWBATExcel4MacroSheet );

IDispatch * tempWorksheet = workbook->Worksheets()->Add();
Q_ASSERT( tempWorksheet != 0 );
if( !tempWorksheet ) return;
Excel::_Worksheet * worksheet = new Excel::_Worksheet( tempWorksheet, workbook );
Q_ASSERT( worksheet != 0 );
if( !worksheet ) return;
worksheet->SetName( "data" );


Excel::Range * range = worksheet->Range( "a1", "b2" );
Q_ASSERT( range != 0 );
if( !range ) return;
Записан
bigirbis
Гость
« Ответ #4 : Сентябрь 05, 2006, 13:06 »

В общем, осилил!!!
Надеюсь мой небольшой опыт пойдет кому-нибудь во благо.
Вот тестовый пример:
Код:

//Создаем объект Excel.Application
QAxObject * application_ = new QAxObject( "Excel.Application", this );
//Выбрасываем исключение, если объект application_ невалидный
if( !application_ ) throw AxException( "Excel.Application" );
//Устанавливаем количество листов на новой книге равным 1
application_->dynamicCall( "SetSheetsInNewWorkbook(int)", QVariant( 1 ) );
//После этого Excel перестает выбрасывать пердупреждения
application_->dynamicCall( "SetDisplayAlerts", QVariant( false ) );
//Создаем объект Workbooks (коллекция книг)
QAxObject * workbooks = application_->querySubObject( "Workbooks" );
//Выбрасываем исключение, если объект workbooks невалидный
if( !workbooks ) throw AxException( "Application.Workbooks" );
//Добавляем новую книгу
QAxObject * workbook = workbooks->querySubObject( "Add()" );
//Выбрасываем исключение, если объект workbook невалидный
if( !workbook ) throw AxException( "Workbooks.Add()" );
//Получаем доступ к активному листу
QAxObject * worksheet = workbook->querySubObject( "ActiveSheet" );
//Выбрасываем исключение, если объект worksheet невалидный
if( !worksheet ) throw AxException( "Workbook.ActiveSheet" );
//Устанавливаем имя листа
worksheet->dynamicCall( "Name", "Data sheeet" );

//Получаем объект Range из активного листа (ячейки A1:B10)
QAxObject * range = worksheet->querySubObject( "Range(const QVariant&)", QVariant( "A1:B10" ) );
//Выбрасываем исключение, если объект range невалидный
if( !range ) throw AxException( "Worksheet.Range(const QVariant&)" );
//Устанавливаем в выбранные ячейки формулу вычисления случайного числа
range->dynamicCall( "SetValue(const QVariant&)", QVariant( QTextCodec::codecForLocale()->toUnicode( "=СЛЧИС()" ) ) );

//Создаем объект Charts (коллекция областей диаграмм)
QAxObject * charts = workbook->querySubObject( "Charts" );
//Выбрасываем исключение, если объект charts невалидный
if( !charts ) throw AxException( "Workbook.Charts" );
//Добавляем новую область диаграмм
QAxObject * chart = charts->querySubObject( "Add()" );
//Выбрасываем исключение, если объект chart невалидный
if( !chart ) throw AxException( "Charts.Add()" );
//Устанавливаем имя области диаграмм
chart->dynamicCall( "Name", "Test chart" );
//Устанавливаем тип области диаграмм
chart->dynamicCall( "ChartType", QVariant( "xlXYScatter" ) );

//Получаем доступ к текущему ряду области диаграмм
QAxObject * series = chart->querySubObject( "SeriesCollection(const QVariant&)", QVariant( 1 ) );
//Выбрасываем исключение, если объект series невалидный
if( !series ) throw AxException( "SeriesCollection(const QVariant&)" );
//Устанавливаем имя ряда
series->dynamicCall( "Name", "New series" );
//Получаем объект Range для оси X в виде QVariant
QVariant source = worksheet->dynamicCall( "Range(const QVariant&)", QVariant( "A1:A10" ) );
//Устанавливаем диапазон значаний X для ряда
series->dynamicCall( "XValues", source );
//Получаем объект Range для оси Y в виде QVariant
source = worksheet->dynamicCall( "Range(const QVariant&)", QVariant( "B1:B10" ) );
//Устанавливаем диапазон значаний Y для ряда
series->dynamicCall( "Values", source );

//Делаем приложение видимым
application_->dynamicCall( "SetVisible(bool)", QVariant( true ) );

Самое попадалово было в том, что для ряда методов входным аргументом является Range. Его можно получить воспользовавшись dynamicCall(), который возвратит контуженный QVariant. И этот QVariant весело жрется методами, ожидающими Range.
Записан
itan
Гость
« Ответ #5 : Ноябрь 22, 2006, 10:10 »

Хотелось бы опять поднять эту тему! У кого-нибудь получалось создать нормальную работоспособную обертку для COM при помощи dumpcpp ? Вот у предыдущего автора, я так понимаю не совсем получилось и в итоге пришлось работать через динамические методы dynamicCall.
Сам пытаюсь сделать так:
1. dumpcpp {00020813-0000-0000-C000-000000000046} (Это EXCEL). В итоге получаю 2 файла: excell.cpp и excell.h
2. Добавляю полученные файлы в проект
3. Пишу код:
Код:
Excel::Application* app = new Excel::Application;
app->SetVisible(true);
app->SetSheetsInNewWorkbook( 1 );
Excel::Workbooks* wbks = app->Workbooks();
wbks->Add();

При выполнении последней строчки вылетает с Unhandled exception!
Да и вообще, при вызове любого метода Excel::Workbooks возникает Unhandled exception.

Кто-нибудь сталкивался с подобным? Может это все недоработки dumpcpp и стоит бросить эту затею?
Записан
bigirbis
Гость
« Ответ #6 : Ноябрь 22, 2006, 11:23 »

Там возникает проблема при ряде обращений к коллекциям (читай выше).  В нашем случае пришлось создать два проекта: второй на C#.
Записан
Godfather
Гость
« Ответ #7 : Ноябрь 16, 2007, 23:57 »

вы не могли бы по-поds не могли бы по-побнее рассказать про использование утилиты dumcpp

и про решение с помощью C# ?

плиз! или надавать ссылок где почитать
Записан
Barmaglodd
Гость
« Ответ #8 : Ноябрь 20, 2007, 09:31 »

А почему нельзя с COM'ом напрямую работать? Берем OleView генерируем заголовки и работаем дальше. Сам так делаю и никаких проблем, QAxObject для простых случаев использую.
Записан
bigirbis
Гость
« Ответ #9 : Ноябрь 20, 2007, 09:39 »

На самом деле появилась еще одна идея по генерации отчетов, но руки до реализации так и не дошли. Можно использовать библиотеки от Open Office. В этом случае все будет кросс-платформенно, да и форматов документов завались...

Может кто уже успел попробовать?
Записан
Tonal
Гость
« Ответ #10 : Ноябрь 20, 2007, 10:54 »

Да вроде народ пишет: http://community.i-rs.ru/index.php/board,9.0.html
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 23.