Подтвердить что ты не робот

Попытка выполнить автоматизацию Office с помощью Excel 2007, но использует Excel 2003

Окружающая среда:

Машина для Windows XP
Установлены как Excel 2007, так и Excel 2003 (в том порядке, а не в хронологическом порядке).
С# 3.5

Проблема:

Когда я использую PIA для автоматизации Office, я использую следующую строку кода:

var excel = new ApplicationClass();

Версия PIA специально ссылается на нее как на Excel 12.
C:\WINDOWS\сборка\GAC\Microsoft.Office.Interop.Excel\12.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll
Но:

 excel.Version;//this is 11.0 instead of 12.0

Таким образом, когда я пытаюсь открыть файл с расширением .xlsx, он предупреждает меня о потерянной функциональности в преобразовании файла и открывает его с excel 2003. Я вполне уверен, что это связано с порядком установки, который составляет 2007 год → 2003, но я не могу удалить 2003 на моем компьютере b/c, у нас есть какая-то автоматизация офиса на нашем веб-сервере для несвязанного проекта, который использует excel 2003.

Я просмотрел файл Policy.11.0.Microsoft.Office.Interop.Excel.config, но он говорит

<bindingRedirect oldVersion="11.0.0.0" newVersion="12.0.0.0"></bindingRedirect>

Итак, я в недоумении. Почему я не могу сообщить COM Interop, какую версию Excel использовать?

4b9b3361

Ответ 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 работали на машине разработчика. Подробнее об этом см.:

Раньше у меня было несколько версий Excel на одной и той же машине разработки, и я лично чувствовал, что недостатки не так сложны, как эти статьи заставляют ее звучать. В целом, Excel 2007 PIA обратно совместим с Excel 2003 PIA, и все работает нормально. Но однажды я попал в реестр, похожий на ваш, и решил "поступить правильно". Я удалил оба, а затем только повторно установил Excel 2007.

Оттуда я установил Virtual PC, который является бесплатным (VMware на самом деле немного лучше, но он не бесплатный), а затем установил мои более низкие версии Excel для 2003, 2002, 2000 и 97 на отдельных виртуальных машинах. Это определенно определенная работа по настройке, но как только вы это сделаете, все будет на 100% чистым.

Тем не менее, я, вероятно, не захотел бы на самом деле развиваться против более низких версий Excel на виртуальной машине, было бы слишком сложно использовать Visual Studio, размещенную внутри виртуальной машины. Таким образом, эти виртуальные машины подходят только для тестирования развертывания, чтобы ваша система могла работать с различными конфигурациями клиентов. Есть смысл?

Надеюсь, это поможет!

Mike