Russian Qt Forum

Qt => ActiveX => Тема начата: CroCIV от Сентябрь 07, 2009, 14:20



Название: COM + Excel + ComboBox
Отправлено: CroCIV от Сентябрь 07, 2009, 14:20
попробую задать не тривиальный вопрос, а вдруг кто сталкивался:
Есть документ xls, в нем есть несколько листов на которых есть различные элементы управления ActiveX (например выпадающий список привязанный к определенным ячейкам), задачи:
1. Получить список всех элементов управления на листе (тип название)
2. Получить указатель на элемент по его имени
3. Выполнить любые манипуляции.

Не хватает смекалки по 1 и 2 задачам, и загуглить не получается, зацепу бы, мб кто уже с таким декувался?
За ранее благода  ::)


Название: Re: COM + Excel + ComboBox
Отправлено: Tonal от Сентябрь 08, 2009, 07:50
Смотри доку по автоматизации Excel-я.


Название: Re: COM + Excel + ComboBox
Отправлено: CroCIV от Сентябрь 08, 2009, 12:36
Смотрю в МСДН вижу фигу
http://msdn.microsoft.com/ru-ru/library/microsoft.office.interop.excel(en-us).aspx
вроде как вот искомое пространство имен, но оно какое-то пустоватое, если лезть вглубь например на уровень книги или листа и смотреть чд чф, то они вообще предательски пустые, к примеру вот
http://msdn.microsoft.com/ru-ru/library/microsoft.office.interop.excel.application_members(en-us).aspx

какбэ я не адепт, воду заряжать через телевизоры, угадывать неописанные свойства и методы ниумею  :-\

Смотрим рисунок (http://file.qip.ru/file/100193079/1bfc9792/_online.html)
 рядом с ячейкой приволжский ФО видим кнопку вроде как от комбобокса с выпадающим списком кто знает, что это такое?


Название: Re: COM + Excel + ComboBox
Отправлено: CroCIV от Сентябрь 08, 2009, 12:38
рисунок  http://file.qip.ru/file/100193079/1bfc9792/_online.html


Название: Re: COM + Excel + ComboBox
Отправлено: Tonal от Сентябрь 09, 2009, 07:53
Доставь в MS Office справку по VBA - там всё очень подробненько описано. :)


Название: Re: COM + Excel + ComboBox
Отправлено: CroCIV от Сентябрь 09, 2009, 15:54
Спасибо, Тонал, помогло сдвинутся с мертвой точки  :D
получилось вот чего:

Код:
QAxWidget *excel = new QAxWidget("Excel.Application");
excel->setProperty("Visible", true);
excel->setProperty("DisplayAlerts", "0");  // Это мне надо, отключает гуеву ругань на различного рода ошибки, чтоб процесс выполнения программы на ошибках и предупреждениях не прерывался

QAxObject *workbooks = excel->querySubObject( "Workbooks" ); //получаем ссылу на коллекцию книг

QAxObject *shab = workbooks->querySubObject("Open(const QString&)", "путь\\имя_файла.xls"); // открываем книгу, хранящуюся на диске, и получаем на нее ссылу
QAxObject *sheet = shab->querySubObject("Worksheets(2)"); // получаем ссылу на искомый лист
QAxObject *range = sheet->querySubObject("Range(const QVariant&)", QVariant(QString("D6"))); // ссыла на ячейку, в которой используется проверка вводимых значений
QAxObject *or = range->querySubObject("Validation"); //ссылка на обьект реализующий контроль вводимых значений, называется почему-то Validation-ом (очень долго я его искал :()
QString s = or->dynamicCall("formula1").toString(); // получаем формулу этого обьекта, в моем случае она хранит именованый массив(range) = name

name = shab->querySubObject("Names(const QVariant&)", QVariant(s));//получаем ссылку на именованный массив
s = name->dynamicCall("RefersTo").toString();//получаем ссылку на массив допустимых значений, что мне и нада

Теперь занет поиском алгоритма как получить значения из этого списка сразу массивом, а не в цикле по одной. Мб кто поделится ссылкой, а то я нуб в VBA оч медленно вперед толкаюсь? ::)


Название: Re: COM + Excel + ComboBox
Отправлено: Tonal от Сентябрь 10, 2009, 06:50
Можно для региона ячеек получить массив значений в виде массива Variant-ов.
Может это тебе как-нибудь поможет. :)

Ну и ещё, можно написать ActiveX dll и подгрузить в Excel.
Тогда скорость всех вызовов ускорится примерно на порядок. :)


Название: Re: COM + Excel + ComboBox
Отправлено: CroCIV от Сентябрь 10, 2009, 08:32
Можно для региона ячеек получить массив значений в виде массива Variant-ов.
Может это тебе как-нибудь поможет. :)
Хорошо, получили массив вариантов, а как его теперь в Qt вытащить? как-то получить абсолютный адресс на этот массив в памяти и из одного процесса получить доступ к памяти дгурого процесса?  ::)


Название: Re: COM + Excel + ComboBox
Отправлено: Tonal от Сентябрь 10, 2009, 11:04
Да не. В твой процесс честно весь массив приедет. :)
А как с этим в Qt работать - я не в курсе смотри доку.


Название: Re: COM + Excel + ComboBox
Отправлено: CroCIV от Сентябрь 10, 2009, 15:07
Чет я понять не могу, вот после вызова QAxObject->dynamicCall(...) в QVariant неизвестно как упал массив неизвестной структуры, теперь как преобразовать этот QVariant так, чтоб в конечном счете выцепить из него свою табличку?
Почему массив символов удается получить на ура, а массив чисел уже нет ? уж не говоря о двумерных массивах?