Ответ 1
Вы не можете программно указать, какую версию Excel использовать. PIA только диктуют, какой интерфейс или объектную модель вы разрабатываете против. Но какая версия Excel фактически запущена, контролируется реестром.
Однако, когда дело доходит до запуска PIA, вы фактически будете работать против самого высокого уровня PIA, установленного в системе. Поэтому, если вы работаете против Excel 2003 PIA, но у клиента есть Excel 2007 с Excel 2007 PIA, ваш код будет работать против Excel 2007 PIA, и он должен работать нормально, потому что Excel 2007 PIA обратно совместим. То есть, каждая версия PIA с более высоким номером (и объектная модель Excel) обратно совместима с командами, составленными против более старой PIA и более старой модели объектов Excel. Обратите внимание, что если на компьютере были установлены как PIAs Excel 2007, так и Excel 2003, тогда более высокая версия PIA будет загружаться, независимо от того, какая версия Excel запущена - так что PIA Excel 2007 будет работать, если бы оба PIA были доступны.
[Редактировать: одно предупреждение заключается в том, что PIA Excel 2007 должны быть 100% обратными совместимыми при использовании VB.NET или С# 4.0. Если вы используете С# 3.0 или ниже, то факт, что необязательные параметры действительно необходимы при вызове с С# 3.0 или ниже, создаст разрыв в некотором коде при работе с PIA или объектной моделью с более высокой версией. Это относительно редко, хотя, и с С# 4.0, эта проблема должна уйти, теоретически.]
Хорошо, поэтому у вас нет большого контроля над PIA, потому что PIA, который вы разработали против, фактически не контролирует, какой PIA будет фактически запущен на клиентской машине.
У вас нет большого контроля над версией Excel. Например, при создании нового экземпляра Excel с помощью:
Excel.Application excelApp = new Application();
Загруженное приложение Excel устанавливается в соответствии с текущей версией, установленной в реестре. Текущая версия сохраняется:
HKEY_CLASSES_ROOT\Excel.Application\CurVer
Похоже, что ключ "CurVer" в вашем случае будет иметь значение по умолчанию "Excel.Application.11" вместо "Excel.Application.12". Изменение этого само по себе может сделать трюк, но я предпочел бы сделать ремонт вместо этого, чтобы убедиться, что все настройки реестра исправлены правильно. (И я не мог знать, что все настройки должны быть.) Хорошо, я просто нашел еще один: вам также нужно будет изменить:
[HKEY_CLASSES_ROOT\CLSID\{00024500-0000-0000-C000-000000000046}\ProgID]
чтобы сохранить значение "Excel.Application.12". Но я настоятельно рекомендую запустить ремонт вместо этого. Я не знаю, какие другие настройки, возможно, потребуется изменить, поэтому их изменение вручную немного рискованно.
Кроме того, вы должны найти следующие ключи:
HKEY_CLASSES_ROOT\Excel.Application.11
HKEY_CLASSES_ROOT\Excel.Application.12
Потому что это версии Excel, которые вы установили.
(см. здесь для дальнейшего обсуждения.)
Я уверен, что это связано с порядок установки - 2007 → 2003
Да, это на 100% правильно. Вы можете попробовать запустить ремонт в Excel 2007, это будет самая простая задача. Если это не сработает, я бы удалил обе, а затем переустановил их оба. Я удалю Excel 2003, а затем удалю 2007 (изменив порядок, в котором вы их установили), а затем установите Excel 2003 и затем установите Excel 2007, чтобы вы устанавливали обе версии в правильном порядке.
Но имейте в виду, что при этом Excel 2007 будет запускаться по умолчанию при вызове Excel.Application excelApp = new Application()
.
Фактически рекомендуемая практика заключается не в том, чтобы обе версии Excel работали на машине разработчика. Подробнее об этом см.:
- Почему разработка VS не поддерживается несколькими версиями Office?
- Можно ли создать одну надстройку для нескольких версий Office?
- Написание клиентов автоматизации для нескольких версий Office
Раньше у меня было несколько версий Excel на одной и той же машине разработки, и я лично чувствовал, что недостатки не так сложны, как эти статьи заставляют ее звучать. В целом, Excel 2007 PIA обратно совместим с Excel 2003 PIA, и все работает нормально. Но однажды я попал в реестр, похожий на ваш, и решил "поступить правильно". Я удалил оба, а затем только повторно установил Excel 2007.
Оттуда я установил Virtual PC, который является бесплатным (VMware на самом деле немного лучше, но он не бесплатный), а затем установил мои более низкие версии Excel для 2003, 2002, 2000 и 97 на отдельных виртуальных машинах. Это определенно определенная работа по настройке, но как только вы это сделаете, все будет на 100% чистым.
Тем не менее, я, вероятно, не захотел бы на самом деле развиваться против более низких версий Excel на виртуальной машине, было бы слишком сложно использовать Visual Studio, размещенную внутри виртуальной машины. Таким образом, эти виртуальные машины подходят только для тестирования развертывания, чтобы ваша система могла работать с различными конфигурациями клиентов. Есть смысл?
Надеюсь, это поможет!
Mike