2015-03-11 5 views
2

Этот код используется для получения пользовательских свойств документа для книги Excel.Как получить CustomDocumentProperties с помощью Excel Interop?

var xlApp = Globals.ThisAddIn.Application; // This works in VSTO Excel Add-in 
var xlApp = new global::Microsoft.Office.Interop.Excel.Application(); // This doesn't work anywhere 
xlApp.Visible = true; 
global::Microsoft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Open(file, false, true, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, false, Type.Missing, Type.Missing); 

global::Microsoft.Office.Core.DocumentProperties properties = workbook.CustomDocumentProperties; // Exception occurs here 
global::Microsoft.Office.Core.DocumentProperty property = properties["propertyname"]; 

Первые 2 строки являются ссылками на Excel Application. Получайте ссылку из внутренних надстроек VSTO, другая - new Application().

При использовании Application от внутренних компонентов VSTO код запускает штрафы без проблем. Но при использовании new Application(), то workbook.CustomDocumentProperties линия бросает InvalidCastException:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Core.DocumentProperties'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{2DF8D04D-5BFA-101B-BDE5-00AA0044DE52}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

Я пытаюсь сделать его работу над проектом C# WinForms без VSTO. Множество примеров и руководств используют new Application() для взаимодействия с Excel, но я заметил, что Microsoft.Office.Interop.Excel.Application - это интерфейс, поэтому использование интерфейса new на самом деле странно для меня. Как я могу создать соответствующее приложение, которое может получить CustomDocumentProperties?

Эталонные Сборки Я использую:

  • Microsoft.Office.Interop.Excel v2.0.50727 Версия 14.0.0.0
  • Microsoft.CSharp v4.0.30319 Версия 4.0.0.0

ответ

2

I noticed that Microsoft.Office.Interop.Excel.Application is an interface, so using new on interface is actually strange to me.

Это странно, но по дизайну. Интерфейс Excel.Application украшен атрибутом CoClass, сообщающим фактическому классу, чтобы создать экземпляр «экземпляра» интерфейса. Подробнее об этом here.

But when using new Application() , the workbook.CustomDocumentProperties line throws InvalidCastException :

Странно действительно снова. У меня возникли некоторые проблемы с использованием свойств документа. Кажется, что возвращаемый фактический класс отличается от спецификации, поэтому я перешел на использование dynamic, чтобы предотвратить проблемы с выпуском типов.

Таким образом, вместо этого:

Microsoft.Office.Core.DocumentProperties properties = workbook.CustomDocumentProperties; 

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

dynamic properties = workbook.CustomDocumentProperties; 
+0

Изменение как 'DocumentProperties', так и' DocumentProperty' для динамической работы на самом деле! Но не уверен, что полагаться на «динамику» - хорошая практика? Нет ли способа обеспечить правильный тип кода, с которым приходится сталкиваться, чтобы предотвратить дальнейшие возможные проблемы времени выполнения? – Jake

+1

Не так далеко, насколько я знаю. На самом деле многие классы взаимодействия используют 'dynamic' именно по этой причине. –

0

How can I create a proper Application that can get the CustomDocumentProperties?

Там нет необходимости создавать новый экземпляр Excel Application, если вы разрабатываете надстройку. Вы должны использовать свойство Application, предоставленное во время выполнения VSTO:

var xlApp = Globals.ThisAddIn.Application; // This works in VSTO Excel Add-in 

Но если вы разрабатываете автономное приложение, которое автоматизирует Excel, в этом случае вам необходимо создать новый экземпляр приложения с помощью нового оператора:

var xlApp = new global::Microsoft.Office.Interop.Excel.Application(); 

Используйте технологию позднего связывания (Type.InvokeMember) для получения или установки свойства документа, как предлагает статья How To Use Automation to Get and to Set Office Document Properties with Visual C# .NET.

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