如何使用Excel Interop获取CustomDocumentProperties?

下面的代码用于获取Excel工作簿的自定义文档属性。

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"]; 

前两行是对Excel Application引用。 一个从VSTO插件内部获取参考,另一个是一个常规的new Application()

从VSTO内部使用Application ,代码运行罚款没有任何问题。 但是当使用new Application()workbook.CustomDocumentProperties行会抛出InvalidCastException

无法将“System .__ ComObject”types的COM对象转换为接口types“Microsoft.Office.Core.DocumentProperties”。 此操作失败,因为IID为“{2DF8D04D-5BFA-101B-BDE5-00AA0044DE52}”的接口的COM组件上的QueryInterface调用由于以下错误而失败:没有此类接口支持(exception来自HRESULT:0x80004002(E_NOINTERFACE)) 。

我正在尝试使它在没有VSTO的C#winforms项目上工作。 很多示例和教程使用new Application() for Excel interop,但我注意到, Microsoft.Office.Interop.Excel.Application是一个接口,所以在界面上使用new对我来说实际上是陌生的。 我怎样才能创build一个合适的应用程序,可以获得CustomDocumentProperties

我正在使用的参考组件:

  • Microsoft.Office.Interop.Excel v2.0.50727版本14.0.0.0
  • Microsoft.CSharp v4.0.30319版本4.0.0.0

我注意到,Microsoft.Office.Interop.Excel.Application是一个接口,所以在界面上使用new对我来说实际上是陌生的。

这确实是奇怪的,但通过devise。 Excel.Application接口用CoClass属性装饰,告诉实际的类在实例化接口时实例化。 更多关于这里 。

但是当使用new Application()workbook.CustomDocumentProperties行会抛出InvalidCastException

又奇怪了。 我自己使用文档属性遇到了一些问题。 看起来返回的实际类与规范不同,所以我转而使用dynamic来防止types转换问题。

所以,而不是这个:

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

使用:

 dynamic properties = workbook.CustomDocumentProperties; 

我怎样才能创build一个合适的应用程序,可以获得CustomDocumentProperties?

如果您开发加载项,则不需要创build新的Excel应用程序实例。 您应该使用VSTO运行时提供的Application属性:

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

但是,如果您开发一个使Excel自动运行的独立应用程序,那么您需要使用new运算符创build一个新的Application实例:

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

使用后期绑定技术(Type.InvokeMember)获取或设置文档属性作为如何使用自动化获取和设置Office文档属性与Visual C#.NET文章build议。