Приложение C #, использующее Excel Interop, легко переключаться между 2003 2007?

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

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

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

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


person user320781    schedule 27.05.2010    source источник
comment
Это бомбы не помогают нам, помогают вам. Сообщения об ошибках предназначены для диагностики проблемы. Не пропускайте их, потому что вы их не понимаете, кто-нибудь из присутствующих обязательно поймет.   -  person Hans Passant    schedule 28.05.2010


Ответы (2)


Взгляните на мой проект MS Office для .NET.

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

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

Я надеюсь, что это помогает.

person TcKs    schedule 27.05.2010
comment
хотя библиотека может быть хорошей, но в ней отсутствует документация и есть только несколько примеров, а также отсутствует помощь, например, как открыть файл, защищенный паролем ... придется покопаться в исходном коде, чтобы найти его - person RohitWagh; 31.01.2013

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

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

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

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

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

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

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

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

- Майк

person Mike Rosenblum    schedule 27.05.2010