06.08.2007, 14:30 | #1 |
Moderator
|
[Excel] - Несколько версий Excel на машине клиента
Добрый день.
У клиента на машине стоит одновременно несколько версий Excel. Задача: дать возможность пользователю указать, с какой именно Excel будет работать Аксапта. Вопрос: - как явно указать, с какой версией Excel должна работать Аксапта. Решение в лоб не сработало: X++: comApplication1 = new COM('Excel.Application.11'); comApplication2 = new COM('Excel.Application.12'); Причина такого поведения кроется в реестре: HKEY_CLASSES_ROOT\\Excel.Application.11 и HKEY_CLASSES_ROOT\\Excel.Application.12 имеют один и тот же CLSID. Похоже, что при установке новой версии Excel, инсталлятор заодно подправляет записи в реестре, относящиеся к предыдущей версии Excel. Можно ли этого избежать при установке? Можно ли в такой ситуации (когда две версии Excel уже установленны именно в таком виде) вызвать из Аксапты нужную версию Excel ? |
|
06.08.2007, 15:00 | #2 |
Участник
|
А если вместо new COM('Excel.Application.11') явно указать GUID класса (new COM('{00024500-0000-0000-C000-000000000046}'); )?
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Gustav (3). |
06.08.2007, 15:36 | #3 |
Moderator
|
Да, как всё же некоторые вещи зашориваются постоянной однобокостью ('Excel.Application' да 'Excel.Application')...
Пока AndyD волшебного пендаля не даст, сам никогда лишний раз не пойдешь и не прочитаешь в хелпе, что... Цитата:
Remarks
The class name of a COM object is either its ProgID (programmatic identifier) or CLSID (class identifier): ProgIDs have the following format: <program>.<component>.<version> (e.g. "AXAPI.Axapta.1 "). Note that the version element of the ProgID can often be omitted. CLSID s are 128 bit values and have to following format: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} (e.g. "{80F444A1-46FF-11D2-8459-0008C7A0D1EA}"). P.S. Андре, если не секрет, зачем это клиенту? Из-за миллиона строк, который позволяет 12 (но в то же время на большинстве машин, наверное, еще только 11)? Спасибо заранее, если ответите |
|
|
За это сообщение автора поблагодарили: belugin (1). |
06.08.2007, 17:47 | #4 |
Moderator
|
Цитата:
А если вместо new COM('Excel.Application.11') явно указать GUID класса (new COM('{00024500-0000-0000-C000-000000000046}'); )?
Сделал поиск строки 'Excel.Application.11' в ветви CLSID - нету. Хотя стоит, запускается и работает. |
|
06.08.2007, 17:48 | #5 |
Moderator
|
Да, еще, в других местах реестра Excel встречается именно под этим CLSID. Хм... может они вообще не отличаются CLSID.Excel.11 и CLSID.Excel.12?
|
|
06.08.2007, 17:50 | #6 |
Moderator
|
Цитата:
Андре, если не секрет, зачем это клиенту?
2) Я поставил оба Excel и хочу иметь возможность тестировать работоспособность программы на обеих версиях Excel. |
|
06.08.2007, 18:37 | #7 |
Moderator
|
Цитата:
- вне Аксапты закрыть все текущие экземпляры Excel; - запустить вне Аксапты нужную версию Excel (в единственном экземпляре) - получить ссылку в Аксапте на этот экземпляр Excel при помощи COM::getObject('Excel.Application'); может, на что сгодится мыслишка? |
|
07.08.2007, 09:41 | #8 |
Moderator
|
небольшой офф-топик про новости Excel 2007
Коль скоро тема балансирует между Excel.Application.11 и Excel.Application.12, или - более понятно - между Excel 2003 и Excel 2007, то показалось полезным привести попавшуюся по ходу ссылку на Возможности Office Excel 2007, не поддерживаемые в более ранних версиях Excel
|
|
07.08.2007, 10:37 | #9 |
Участник
|
Цитата:
Сообщение от Gustav
еще днем мне в голову "мозговым штурмом" приходила такая заднепроходная полуручная процедура:
- вне Аксапты закрыть все текущие экземпляры Excel; - запустить вне Аксапты нужную версию Excel (в единственном экземпляре) - получить ссылку в Аксапте на этот экземпляр Excel при помощи COM::getObject('Excel.Application'); может, на что сгодится мыслишка? Код: [HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\LocalServer] @="C:\\PROGRA~1\\MICROS~2\\OFFICE11\\EXCEL.EXE /automation" "LocalServer"=hex(7):38,5d,67,41,56,6e,2d,7d,66,28,5a,58,66,65,41,52,36,2e,6a,\ 69,45,58,43,45,4c,46,69,6c,65,73,3e,21,44,65,40,5d,56,7a,28,72,3d,66,60,31,\ 6c,66,71,60,3f,52,26,20,2f,61,75,74,6f,6d,61,74,69,6f,6e,00,00 |
|
07.08.2007, 11:08 | #10 |
Участник
|
Насколько я понимаю, Excel не поддерживает версионность COM-интерфейса. Т.е. чтобы физически была возможность запустить разные версии Excel через COM-интерфейс в реестре должны быть разные CLSID для разных версий. Но реально CLSID одинаковый для любой версии Excel. Вопрос только в том, что именно он запускает.
Это значит, что чтобы сделать возможность выбора версии Excel через COM-интерфейс надо иметь возможность напрямую править сам реестр. Изменить настройки (привязку) CLSID к конкретной версии Excel. Не думаю, что в этом есть смысл. Ведь если официально прописано о поддержке определенной версии Excel, то установка другой версии - это риск самого пользователя. Кроме того, конечно, некоторые свойства и методы COM-интерфейса в разных версиях меняются, но в основном, все остается без изменений. Так что, думаю, не должно быть особых проблем при работе со старшей версией, кроме некоторых специфических ситуаций. Да, проверить какую же версию Excel подхватил COM-интерфейс можно через свойство version() X++: Com excel; ; excel = new Com("Excel.Application"); info(strFmt("%1",excel.version())); |
|
|
За это сообщение автора поблагодарили: Андре (5), aidsua (1). |
07.08.2007, 11:26 | #11 |
Moderator
|
INFO: Автоматизация Office в системе, где установлено несколько версий пакета MS Office:
Цитата:
Бытует мнение, что при автоматизации Office в системе, где установлены пакеты несколько версий Office, можно указать загружаемую версию приложения с помощью программного идентификатора PROGID, который уникален для каждой версии продукта (например, для загрузки Excel 2000 служит идентификатор Excel.Application.9, Excel 2002 соответствует Excel.Application.10, а Office Excel 2003 — Excel.Application.11). В действительности это не так. Для Excel 2000, 2002 и 2003 используется один и тот же идентификатор класса (CLSID), а это значит, что версия приложения, загружаемая с одним из программных идентификаторов (PROGID), определяется только порядком установки версий программы.
|
|
|
За это сообщение автора поблагодарили: vladz (1). |
07.08.2007, 13:45 | #12 |
Moderator
|
Владимир Максимов,
Цитата:
Насколько я понимаю, Excel не поддерживает версионность COM-интерфейса.
|
|
Теги |
excel |
|
|