以编程方式访问 Excel 自定义文档属性 [英] Accessing Excel Custom Document Properties programmatically
问题描述
我正在尝试将自定义属性添加到我以编程方式创建的工作簿中.我有一种用于获取和设置属性的方法,但问题是工作簿为 CustomDocumentProperties 属性返回 null.我不知道如何初始化这个属性,以便我可以从工作簿中添加和检索属性.Microsoft.Office.Core.DocumentProperties 是一个接口,所以我不能去做下面的事情
I'm trying to add custom properties to a workbook I have created programmatically. I have a method in place for getting and setting properties, but the problem is the workbook is returning null for the CustomDocumentProperties property. I cannot figure out how to initialize this property so that I can add and retrieve properties from the workbook. Microsoft.Office.Core.DocumentProperties is an interface, so I cant go and do the following
if(workbook.CustomDocumentProperties == null)
workbook.CustomDocumentProperties = new DocumentProperties;
这是我必须获取和设置属性的代码:
Here is the code I have to get and set the properties:
private object GetDocumentProperty(string propertyName, MsoDocProperties type)
{
object returnVal = null;
Microsoft.Office.Core.DocumentProperties properties;
properties = (Microsoft.Office.Core.DocumentProperties)workBk.CustomDocumentProperties;
foreach (Microsoft.Office.Core.DocumentProperty property in properties)
{
if (property.Name == propertyName && property.Type == type)
{
returnVal = property.Value;
}
DisposeComObject(property);
}
DisposeComObject(properties);
return returnVal;
}
protected void SetDocumentProperty(string propertyName, string propertyValue)
{
DocumentProperties properties;
properties = workBk.CustomDocumentProperties as DocumentProperties;
bool propertyExists = false;
foreach (DocumentProperty prop in properties)
{
if (prop.Name == propertyName)
{
prop.Value = propertyValue;
propertyExists = true;
}
DisposeComObject(prop);
if(propertyExists) break;
}
if (!propertyExists)
{
properties.Add(propertyName, false, MsoDocProperties.msoPropertyTypeString, propertyValue, Type.Missing);
}
DisposeComObject(propertyExists);
}
线properties = workBk.CustomDocumentProperties 作为 DocumentProperties;始终将属性设置为 null.
The line properties = workBk.CustomDocumentProperties as DocumentProperties; always set properties to null.
这是使用 Microsoft.Office.Core v12.0.0.0 和 Microsoft.Office.Interop.Excell v12.0.0.0 (Office 2007)
This is using Microsoft.Office.Core v12.0.0.0 and Microsoft.Office.Interop.Excell v12.0.0.0 (Office 2007)
推荐答案
我查看了自己的代码,可以看到我使用后期绑定访问属性.我不记得为什么,但我会发布一些代码以防万一.
I looked at my own code and can see that I access the properties using late binding. I can't remember why, but I'll post some code in case it helps.
object properties = workBk.GetType().InvokeMember("CustomDocumentProperties", BindingFlags.Default | BindingFlags.GetProperty, null, workBk, null);
object property = properties.GetType().InvokeMember("Item", BindingFlags.Default | BindingFlags.GetProperty, null, properties, new object[] { propertyIndex });
object propertyValue = property.GetType().InvokeMember("Value", BindingFlags.Default | BindingFlags.GetProperty, null, propertyWrapper.Object, null);
编辑:啊,现在我记得为什么一>.:-)
EDIT: ah, now I remember why. :-)
编辑 2:Jimbojones 的回答 - 使用 dynamic 关键字 - 是一个更好的解决方案(如果您重视易用性而不是使用 dynamic
的性能开销)).
EDIT 2: Jimbojones' answer - to use the dynamic keyword - is a better solution (if you value ease-of-use over the performance overhead of using dynamic
).
这篇关于以编程方式访问 Excel 自定义文档属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!