Попытка сделать Office Automation с Excel 2007, но продолжает использовать Excel 2003
Среда:
Windows XP машина
Установлены и Excel 2007, и Excel 2003 (в этом порядке, а не в хронологическом порядке).
C# 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 на моей машине, потому что у нас есть некоторая автоматизация офиса на нашем веб-сервере для несвязанного проекта, который использует 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 использовать?
1 ответ
Вы не можете программно указать, какую версию 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 на компьютере разработчика. Подробнее об этом смотрите:
- Почему разработка VS не поддерживается несколькими версиями Office?
- Можете ли вы создать одну надстройку для нескольких версий Office?
- Написание клиентов автоматизации для нескольких версий Office
Раньше у меня было несколько версий Excel на одном и том же компьютере для разработки, и я лично чувствовал, что недостатки не были такими сложными, как эти статьи заставляют это звучать. В общем, Excel 2007 PIA обратно совместим с Excel 2003 PIA, и все работает отлично. Но однажды я попал в реестр, похожий на ваш, и решил "поступать правильно". Я удалил оба, а затем только переустановил Excel 2007.
Оттуда я установил Virtual PC, который является бесплатным (VM ware на самом деле немного лучше, но он не бесплатный), а затем установил мои более низкие версии Excel для 2003, 2002, 2000 и '97 на отдельных виртуальных машинах. Это определенно какая-то работа по настройке, но как только вы это сделаете, все будет на 100% чисто.
Тем не менее, я, вероятно, не хотел бы на самом деле разрабатывать против более ранних версий Excel на виртуальной машине, было бы слишком сложно использовать Visual Studio, размещенный в виртуальной машине. Таким образом, эти виртуальные машины хороши только для тестирования развертывания, чтобы убедиться, что ваша система может работать с различными конфигурациями клиентов. Есть смысл?
Надеюсь это поможет!
Майк