Jak*_*ake 5 c# excel interop vsto
以下代码用于获取 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"];
Run Code Online (Sandbox Code Playgroud)
前 2 行是对 Excel 的引用Application。一种是从 VSTO 插件内部获取引用,另一种是常规的new Application().
当使用ApplicationVSTO 内部结构时,代码运行良好,没有任何问题。但是使用时new Application(),该workbook.CustomDocumentProperties行会抛出InvalidCastException:
无法将类型“System.__ComObject”的 COM 对象强制转换为接口类型“Microsoft.Office.Core.DocumentProperties”。此操作失败,因为对 IID 为“{2DF8D04D-5BFA-101B-BDE5-00AA0044DE52}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE)) 。
我正在尝试让它在没有 VSTO 的情况下在 C# winforms 项目上工作。很多示例和教程都用于new Application()Excel 互操作,但我注意到这Microsoft.Office.Interop.Excel.Application是一个接口,因此new在接口上使用对我来说实际上很奇怪。如何创建一个可以获取的正确应用程序CustomDocumentProperties?
我正在使用的参考组件:
我注意到 Microsoft.Office.Interop.Excel.Application 是一个接口,因此在接口上使用 new 对我来说实际上很奇怪。
这确实很奇怪,但却是有意为之。该Excel.Application接口用CoClass属性装饰,告诉实际类在“实例化”接口时进行实例化。更多相关信息请参见此处。
但是使用时
new Application(),该workbook.CustomDocumentProperties行会抛出InvalidCastException:
确实又奇怪了。我自己在使用文档属性时遇到了一些问题。似乎返回的实际类与规范不同,因此我转而使用它dynamic以防止类型转换问题。
所以代替这个:
Microsoft.Office.Core.DocumentProperties properties = workbook.CustomDocumentProperties;
Run Code Online (Sandbox Code Playgroud)
使用:
dynamic properties = workbook.CustomDocumentProperties;
Run Code Online (Sandbox Code Playgroud)