Пытаюсь реализовать автоматизацию Office с помощью Excel 2007, но продолжает использовать Excel 2003.

StackOverflow https://stackoverflow.com/questions/2239472

Вопрос

Среда:

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

Проблема:

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

var excel = new ApplicationClass();

В версии PIA он конкретно упоминается как Excel 12.
C:\WINDOWS\assembly\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 на своем компьютере, поскольку на нашем веб-сервере есть некоторая офисная автоматизация для несвязанного проекта, использующего 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 использовать?

Это было полезно?

Решение

Вы не можете программно указать, какую версию Excel использовать.PIA только определяют, какой интерфейс или объектную модель вы разрабатываете.Но какая версия Excel на самом деле работает, определяется реестром.

Однако когда дело доходит до запуска PIA, вы фактически будете работать с PIA самого высокого уровня, установленным в системе.Таким образом, если вы разрабатываете с использованием PIA Excel 2003, но у клиента есть Excel 2007 с PIA Excel 2007, ваш код будет работать с PIA Excel 2007 - и он должен работать нормально, поскольку PIA Excel 2007 обратно совместим.То есть каждая версия PIA с более высоким номером (и объектная модель Excel) обратно совместима с командами, скомпилированными с использованием более старого PIA и более старой объектной модели Excel.Обратите внимание: если на компьютере клиента установлены PIA Excel 2007 и Excel 2003, то PIA более высокой версии будет загружаться независимо от того, какая версия Excel запущена, поэтому PIA Excel 2007 будет работать, если оба PIA доступны.

[Редактировать:Единственное предостережение: PIA Excel 2007 должны быть на 100% обратно совместимы при использовании VB.NET или C# 4.0.При использовании C# 3.0 или более ранней версии тот факт, что дополнительные параметры действительно требуются при вызове из C# 3.0 или более ранней версии, приведет к разрыву некоторого кода при работе с PIA или объектной моделью более высокой версии.Однако это случается относительно редко, и с выходом C# 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 на одной и той же машине разработки, и лично я чувствовал, что недостатки не так сложны, как кажется в этих статьях.В целом PIA Excel 2007 обратно совместим с PIA Excel 2003, и все работает нормально.Но я однажды попал в такую ​​же кашу в реестре, как и ваша, и решил "поступить правильно".Я удалил оба, а затем переустановил Excel 2007.

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

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

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

Майк

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top