C # приложение, которое использует Excel Interop, легко переключаться между 2003 2007? - PullRequest
3 голосов
/ 28 мая 2010

У меня написано приложение, которое просто выполняет базовые операции ввода-вывода в электронной таблице. Прочитайте несколько ячеек, выполните некоторую сортировку и выведите результат обратно в другую электронную таблицу. Отлично работает на моей машине. У меня установлен Office 2003.

Когда он работает на чьей-либо машине с 2007 года, он взрывается, предположительно из-за различных версий сборок Interop.

Я надеялся, что кто-то знает способ динамического изменения того, откуда и куда загружается сборка, в зависимости от версии для офиса (получить версию для офиса легко из реестра).

Просеивая оставшуюся часть интернета, я не увидел ничего, что указывало бы на то, что это было возможно :(. Я попытался установить PIA 2007 года, но когда я пытаюсь добавить ссылку, они не отображаются, и я понятия не имею, где найдите их (они не находятся в каталоге c: \ windows \ сборки \; возможно, установка не сработала). Нужно ли мне устанавливать машину с установленным 2007-м для сборки каждый раз, когда мне нужно будет обновить?

Ответы [ 2 ]

1 голос
/ 28 мая 2010

На самом деле более вероятно, что версия времени выполнения, которая представляет проблему совместимости, а не PIA.

Когда он работает на чьей-то машине с 2007 года, он бомбит, предположительно из-за разных версии сборок Interop.

Я знаю, что это может "чувствовать" таким образом, но этот сценарий маловероятен. PIA Excel 2007 шире, чем PIA 2003 года, но не уже. Могут быть добавлены типы, члены и необязательные параметры, но более старые подписи 2003 года не будут изменены. Поэтому все ваши старые вызовы 2003 года будут работать одинаково, независимо от того, работают ли они через PIA 2003 или PIA 2007. Конечно, это не гарантировано на 100,00%, но, вероятно, примерно на 99,8%, я думаю.

Я надеялся, что кто-то знает способ динамически изменить, какие / где сборка загружается из в зависимости от офисная версия (получение офиса версия легко из реестра).

Вам потребуется использовать отражение, например, метод Assembly.LoadFrom . Но я действительно не думаю, что вам нужно идти по этому пути, честно. Фактически, чтобы доказать это, вы должны изменить ссылку в вашей сборке на версию 2007 года, скомпилировать ее и запустить. Я готов поспорить, что вы получите точно такую ​​же ошибку.

Но с чего бы это? И как бы это исправить?

Проблем совместимости между объектной моделью Excel 2003 и Excel 2007 немного, но они есть. Одним из примеров является свойство Range.Cells.Count, которое возвращает Int32 с максимальным значением +4,3 млрд. (Приблизительно). Однако с появлением в Excel 2007 гораздо больших таблиц число ячеек в электронной таблице фактически составляет около 17,2 млрд. Поэтому Range.Cells.Count выдает исключение, если Диапазон слишком велик (например, содержит весь лист). Вместо этого вам нужно вызвать Range.Cells.CountLarge, который, поскольку он возвращает Int64, может обработать больший результат.

Таким образом, скорее всего, проблема совместимости связана с версией времени выполнения, а не с PIA. Поэтому вам следует изолировать строку, которая выдает исключение, и сообщить нам, что это за сообщение об ошибке. Тогда, может быть, мы можем помочь ...

- Майк

1 голос
/ 28 мая 2010

Посмотрите на мой проект MS Office для .NET .

Это набор управляемых сборок с типами-оболочками, написанными в VB.NET с использованием поздних привязок и динамически загружаемых COM-объектов. Работает с версиями 97-2007. PIA не требуется.

Я сохранил объектную модель, поэтому большинство образцов VSTO должны работать с небольшими изменениями.

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

...