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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: COM + Excel + ComboBox  (Прочитано 11982 раз)
CroCIV
Гость
« : Сентябрь 07, 2009, 14:20 »

попробую задать не тривиальный вопрос, а вдруг кто сталкивался:
Есть документ xls, в нем есть несколько листов на которых есть различные элементы управления ActiveX (например выпадающий список привязанный к определенным ячейкам), задачи:
1. Получить список всех элементов управления на листе (тип название)
2. Получить указатель на элемент по его имени
3. Выполнить любые манипуляции.

Не хватает смекалки по 1 и 2 задачам, и загуглить не получается, зацепу бы, мб кто уже с таким декувался?
За ранее благода  Строит глазки
Записан
Tonal
Гость
« Ответ #1 : Сентябрь 08, 2009, 07:50 »

Смотри доку по автоматизации Excel-я.
Записан
CroCIV
Гость
« Ответ #2 : Сентябрь 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

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

Смотрим рисунок
 рядом с ячейкой приволжский ФО видим кнопку вроде как от комбобокса с выпадающим списком кто знает, что это такое?
Записан
CroCIV
Гость
« Ответ #3 : Сентябрь 08, 2009, 12:38 »

рисунок  http://file.qip.ru/file/100193079/1bfc9792/_online.html
Записан
Tonal
Гость
« Ответ #4 : Сентябрь 09, 2009, 07:53 »

Доставь в MS Office справку по VBA - там всё очень подробненько описано. Улыбающийся
Записан
CroCIV
Гость
« Ответ #5 : Сентябрь 09, 2009, 15:54 »

Спасибо, Тонал, помогло сдвинутся с мертвой точки  Веселый
получилось вот чего:

Код:
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 оч медленно вперед толкаюсь? Строит глазки
Записан
Tonal
Гость
« Ответ #6 : Сентябрь 10, 2009, 06:50 »

Можно для региона ячеек получить массив значений в виде массива Variant-ов.
Может это тебе как-нибудь поможет. Улыбающийся

Ну и ещё, можно написать ActiveX dll и подгрузить в Excel.
Тогда скорость всех вызовов ускорится примерно на порядок. Улыбающийся
Записан
CroCIV
Гость
« Ответ #7 : Сентябрь 10, 2009, 08:32 »

Можно для региона ячеек получить массив значений в виде массива Variant-ов.
Может это тебе как-нибудь поможет. Улыбающийся
Хорошо, получили массив вариантов, а как его теперь в Qt вытащить? как-то получить абсолютный адресс на этот массив в памяти и из одного процесса получить доступ к памяти дгурого процесса?  Строит глазки
Записан
Tonal
Гость
« Ответ #8 : Сентябрь 10, 2009, 11:04 »

Да не. В твой процесс честно весь массив приедет. Улыбающийся
А как с этим в Qt работать - я не в курсе смотри доку.
Записан
CroCIV
Гость
« Ответ #9 : Сентябрь 10, 2009, 15:07 »

Чет я понять не могу, вот после вызова QAxObject->dynamicCall(...) в QVariant неизвестно как упал массив неизвестной структуры, теперь как преобразовать этот QVariant так, чтоб в конечном счете выцепить из него свою табличку?
Почему массив символов удается получить на ура, а массив чисел уже нет ? уж не говоря о двумерных массивах?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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