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

Среда:

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

Проблема:

Когда я использую PIAs, чтобы сделать некоторую Автоматизацию делопроизводства, я использую следующую строку кода:

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 на своей машине b/c, у нас есть некоторая автоматизация делопроизводства на нашем веб-сервере для несвязанного проекта, который использует Excel 2003.

Я посмотрел на политику 11.0. Microsoft. Office. Interop. Материал Excel.config, но это говорит

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

Так, я в замешательстве. Почему я не могу сказать COM Interop который версия Excel использовать?

12
задан Andy_Vulhop 10 February 2010 в 18:51
поделиться

1 ответ

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

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

[Edit: One caveat: One caveat is that the Excel 2007 PIAs should be 100% backward compatible when using VB.NET or 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 на одной машине для разработки, и я лично чувствовал, что недостатки не так сложны, как кажется в этих статьях. В целом, Excel 2007 PIA обратно совместим с Excel 2003 PIA, и все работает нормально. Но однажды я столкнулся с проблемой в реестре, похожей на вашу, и решил "поступить правильно". Я деинсталлировал обе программы, а затем заново установил только Excel 2007.

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

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

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

Mike

23
ответ дан 2 December 2019 в 06:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: