2013-09-26 1 views
2

Я хочу изучить этот путь работы с Excel динамически. Загрузка всех COM-типов Excel динамически?


Я хочу использовать Excel в своем приложении C# без включения DLL и т. Д. Сначала я просто проверил бы, будет ли установлена ​​требуемая версия Excel и запустите ее.

Прежде всего я хочу, чтобы получить все типы, мне нужно, но я не могу достать из них:

// works 
Type typeExcel = Type.GetTypeFromProgID("Excel.Application"); 
object excel = Activator.CreateInstance(typeExcel); 
object workbooks = typeExcel.InvokeMember("Workbooks", BindingFlags.GetProperty, null, excel, null); 

// this doesn't work, returns null 
Type typeWorkbooks = Type.GetTypeFromProgID("Excel.Workbooks"); 

Без правильных типов я не могу вызывающими членов. Так что я делаю неправильно? Как загрузить все типы, которые мне нужны, и знать, что они есть? Моя текущая версия Excel - 2003 год. Причины для этого: Если я включаю COM-библиотеки, которые не установлены в целевой системе, мое приложение не запускается. Если я загружу их динамически, я могу проверить их существование и уведомить пользователя о недостающей функциональности.

+0

Что вы пытаетесь выполнить точно?Если вы хотите полагаться на interop (и, следовательно, не нужно использовать библиотеки DLL, но вам нужно добавить данную ссылку к вашему проекту и настроить свою разработку на специально упомянутую версию (ы) Office), вам не нужно это делать. Здесь вы найдете руководство по началу работы: http://support.microsoft.com/kb/302084/en-us – varocarbas

+0

PS: также помните, что Office 2003 довольно старый и имеет «некоторые особенности». Например, на компьютере, где вы хотите использовать приложение, необходимо установить «Распространяемые первичные сборочные сборки» (http://www.microsoft.com/en-us/download/details.aspx?id=20923). Это также требуется в Office 2007 (его конкретный пакет); но уже не с Office 2010. – varocarbas

+0

@varocarbas Я попрошу моего босса позже, если я смогу работать с Office 2010. Но на данный момент я застрял в 2003 году. – Bitterblue

ответ

6

Использование dynamic.

Type typeExcel = Type.GetTypeFromProgID("Excel.Application"); 

dynamic excel = Activator.CreateInstance(typeExcel); 
excel.Visible = true; 

dynamic workbooks = excel.Workbooks; 
workbooks.Add(); 
workbooks.Add(); 

Также см. this answer.

+0

Что такое динамическое? и какова его связь с interop и разницей версий Office? – varocarbas

+0

@varocarbas 'dynamic' является [функцией C#] (http://stackoverflow.com/q/961581/11683). – GSerg

+0

Спасибо за разъяснение, очень поучительный. Все еще не уверен в точной применимости всего этого к Office/interop, но, конечно же, интересен в любом случае. – varocarbas

2

Если я включаю COM-библиотеки, которые не установлены в целевой системе, мое приложение не запускается.

Лечение, которое вы ищете, значительно хуже, чем проблема. Нет ничего более симпатичного в отношении кода, связанного с поздним связыванием, когда вы пытаетесь выполнить свой фрагмент. динамическое ключевое слово, поддерживаемое в версии C# 4, безусловно, делает синтаксис намного более дружелюбным. Однако в момент написания кода нет ничего дружелюбного, вы не получите IntelliSense. И ничто не дружелюбное во время выполнения, ошибки, которые вы совершаете во время кодирования, вызывают исключения, а поздняя привязка имеет значительные накладные расходы.

Есть простые встречные меры для обеспечения сборки взаимодействия доступны:

  • Попросите ваш пользователь установить офис Primary Interop сборку (PIA).

  • Это очень редко, поскольку на самом деле требуется PIA, это необходимо, только когда вы раскрываете тип Office в своих собственных общедоступных методах и используете его в другой сборке. Выберите сборки Microsoft.Office.Interop в своем справочном узле и установите для свойства Copy Local значение true. Перестройте, и вы получите эти сборки в своем каталоге сборки. Скопируйте их вместе с вашими собственными исполняемыми файлами на клиентскую машину.

  • VS2010 и выше имеют Золотое решение для этой детали развертывания. Выберите сборку interop в вашем ссылочном узле и установите для свойства Embed Interop Types значение True. Объявления interop теперь будут объединены в ваш собственный исполняемый файл, и вам больше не нужно будет развертывать сборки interop или PIA.

Поскольку вы приняли динамическое решение, доступное на VS2010 и вверх, последняя пуля является тот, который вы хотите.

Смежные вопросы