|
|
|
Supreme 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?
|
|
|
|
|
Supreme 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 и далее пройтись по полям и извлечь информацию. (по крайней мере на данный момент это все).
|
|
|
|
|
Supreme Being
      
участник
Last Login: 25.09.2007 19:42
Сообщ.: 116,
Visits: 1 037
|
|
А Вы попробуйте не через референсы, а через CreateObject (пардон, за старый VB-синтаксис). И создавайте экземпляр "Excel.Application". Эта запись ссылается на ту версию Excel, которая есть на машине. Правда в этом случае вы будете иметь дело с поздним связыванеим... Но вам вроде быстродействие не особо требуется.
На счет совместимости. Вроде бы документы ворда и эксела с 97 версии до 2003 совместимы в обе стороны. (хотя может какие-то особенности и не передаются, но у Вас же просто данные).
|
|
|
|
|
Supreme 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. Надо попробовать.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 25.09.2007 19:42
Сообщ.: 116,
Visits: 1 037
|
|
Dim excel_app as object
'Далее никаких CType'ов
excel_app = CreateObject("Excel.Application")
Да, через точку не будут выпадать св-ва и методы, но писать вручную вы их сможете, и оно будет работать.... наверное...
|
|
|
|
|
Supreme 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.
|
|
|
|