Загрузка кода, в зависимости от версии Excel
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Загрузка кода, в зависимости от версии Excel Expand / Collapse
Автор
Сообщение
26.09.2006 16:23


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2007 20:05
Сообщ.: 279, Visits: 3 001
Мне необходимо получить некоторые данные из таблицы Excel.

Я добавил к проекту с помощью Add References библиотеку Microsoft Excel 11.0 Object Library (у меня установлен OF.2003). В связи с этим ворос:

1. Есть ли возможность, и как, получив информацию о версии Excel установленной на пользовательском компе, использовать соответсвующую библиотеку? Могу ли я с помощью используемой мной библиотеки открывать другие версии Excel файлов (97, 2000, ХР, 2007), если мне необходима базовая функциональность?

2. После добавления Excel к проекту, у меня появилось новое пространство имен, которое теперь конфликтует с System.Windows.Forms . В примерах от MSDN доступ к классам Excel происходит через namespace Microsoft.Office.InterOp.Excel, у меня же нет такого пространсва, зато появился namespace Excel. Думаю отсюда и проблемы с сонтролями из System.* Может я не ту библиотеку подключил? Или может это потому, что я пользуюсь VB.NET Express вместо Visual Studio 2005?

Сообщ. #904884
27.09.2006 16:21


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2007 20:05
Сообщ.: 279, Visits: 3 001
По поводу второго пункта, я нашел решение. Необходимо с сайта MSDN скачать два дополнительных пакета и установить их, это  Office 2003 Primary Interop Assemblies и Visual Studion Office Tools Redistributable. Добавить к проекту библиотеку Microsoft.Office.Interop.Exel.dll. Библиотеку Microsoft Excel 11.0 Object Library можно спокойно удалять из проекта, она больше не нужна.

Остается открытым вопрос, что делать если у пользователя не установлен Office 2003? Можно ли только с помощью этих двух пакетов открывать более ранние/более поздние версии XLS файлов? Если нет, то каким образом перегружать assemblies в зависимости от установленной версии?

Собственно от Excel мне надо только открыть Workbook, получить доступ к Workseet, из него получить доступ к UsedRange и далее пройтись по полям и извлечь информацию. (по крайней мере на данный момент это все).

Сообщ. #904962
30.09.2006 22:37
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 25.09.2007 19:42
Сообщ.: 116, Visits: 1 037
А Вы попробуйте не через референсы, а через CreateObject (пардон, за старый VB-синтаксис). И создавайте экземпляр "Excel.Application". Эта запись ссылается на ту версию Excel, которая есть на машине. Правда в этом случае вы будете иметь дело с поздним связыванеим... Но вам вроде быстродействие не особо требуется.
На счет совместимости. Вроде бы документы ворда и эксела с 97 версии до 2003 совместимы в обе стороны. (хотя может какие-то особенности и не передаются, но у Вас же просто данные).
Сообщ. #905123
01.10.2006 15:55


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2007 20:05
Сообщ.: 279, Visits: 3 001
А оно по-любому, приходится через CreateObject. Проблема не в этом, для того, чтобы получить доступ к функциям объекта надо знать его тип, поэтому и необходимо добавлять библиотеки типов.

Т.е. если я делаю так

excel_app = CreateObject("Excel.Application")

то мне надо определить excel_app так

Dim excel_app as Microsoft.Office.InterOp.Excel.Application
excel_app = CType(CreateObject("Excel.Application"), _
                           Microsoft.Office.InterOp.Excel.Application)

Хотя... Я еще не пробовал использование CreateObject в стиле VB6. Надо попробовать.

Сообщ. #905127
05.10.2006 13:54
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 25.09.2007 19:42
Сообщ.: 116, Visits: 1 037
Dim excel_app as object
'Далее никаких CType'ов
excel_app = CreateObject("Excel.Application")

Да, через точку не будут выпадать св-ва и методы, но писать вручную вы их сможете, и оно будет работать.... наверное...
Сообщ. #905305
08.10.2006 14:59


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 23.04.2007 23:36
Сообщ.: 1 541, Visits: 16 997
На предмет строгих типов, disposability и позднего связыания для COM смотреть тут: http://www.codeproject.com/csharp/safecomwrapper.asp

От себя добавлю, что сам уже пользовался этим способом для ворда и кой-каких других COM-библиотек, все работало великолепно. А возможность заворачивать псевдо-COM-классы в Using - это вообще сказка.

Единственный минус - что нужно объявлять интерфейсы, но(!) можно, во-первых, объявлять только те члены, которыми пользуешься в коде, и во-вторых, есть автоматические утилиты для расчленения COM.


Сообщ. #905428
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl, Alexey Spirin

Время GMT +3:00, Сейчас 3:45