[英]How to get CustomDocumentProperties using Excel Interop?
以下代码用于获取 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”的 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;
用:
dynamic properties = workbook.CustomDocumentProperties;
如何创建可以获取 CustomDocumentProperties 的正确应用程序?
如果您开发加载项,则无需创建新的 Excel 应用程序实例。 您应该使用 VSTO 运行时提供的 Application 属性:
var xlApp = Globals.ThisAddIn.Application; // This works in VSTO Excel Add-in
但是,如果您开发了一个自动化 Excel 的独立应用程序,在这种情况下,您需要使用 new 运算符创建一个新的 Application 实例:
var xlApp = new global::Microsoft.Office.Interop.Excel.Application();
使用后期绑定技术 (Type.InvokeMember) 获取或设置文档属性,如如何使用自动化获取和设置 Office 文档属性与 Visual C# .NET文章所建议的那样。
我遇到了同样的问题。 今天已经解决了。 有一种不同的方法来得出结果。 问题及其答案在
如何使用 c# excel interop 读取 excel 自定义文档属性
这是我的实现。
public string CheckDocProp(string propName, object props)
{
Excel.Workbook workBk = Globals.ThisAddIn.Application.ActiveWorkbook;
object customProperties = workBk.CustomDocumentProperties;
Type docPropsType = customProperties.GetType();
object nrProps;
object itemProp = null;
object oPropName;
object oPropVal = null;
nrProps = docPropsType.InvokeMember("Count",
BindingFlags.GetProperty | BindingFlags.Default,
null, props, new object[] { });
int iProps = (int)nrProps;
for (int counter = 1; counter <= ((int)nrProps); counter++)
{
itemProp = docPropsType.InvokeMember("Item",
BindingFlags.GetProperty | BindingFlags.Default,
null, props, new object[] { counter });
oPropName = docPropsType.InvokeMember("Name",
BindingFlags.GetProperty | BindingFlags.Default,
null, itemProp, new object[] { });
if (propName == oPropName.ToString())
{
oPropVal = docPropsType.InvokeMember("Value",
BindingFlags.GetProperty | BindingFlags.Default,
null, itemProp, new object[] { });
return oPropVal.ToString();
break;
}
else
{
return "Not Found.";
}
}
return "Not Found.";
}
用法:
object docProps = wb.CustomDocumentProperties;
string prop1 = ExistsDocProp("<CustomProperty>", docProps);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.