我想自定义属性添加到我已编程方式创建一个工作簿。 我对获取和设置属性到位的方法,但问题是该工作簿为CustomDocumentProperties属性返回null。 我无法弄清楚如何初始化这个属性,这样我可以从工作簿中添加和检索性能。 Microsoft.Office.Core.DocumentProperties是一个接口,所以我不能去,然后执行以下
if(workbook.CustomDocumentProperties == null)
workbook.CustomDocumentProperties = new DocumentProperties;
这里是我得和设置属性的代码:
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);
}
行属性= workBk.CustomDocumentProperties作为DocumentProperties; 始终设置属性设置为null。
这是使用Microsoft.Office.Core v12.0.0.0和Microsoft.Office.Interop.Excell v12.0.0.0(Office 2007中)
Answer 1:
我看了看自己的代码,并可以看到,我使用后期绑定访问属性。 我不记得为什么,但我会后一些代码的情况下,它帮助。
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);
编辑 :啊,我现在还记得为什么 。 :-)
编辑2:Jimbojones'的答案-使用动态关键字-是一个更好的解决方案(如果你看重易用性的使用了使用的性能开销dynamic
)。
Answer 2:
如果您靶向.NET 4.0,您可以使用dynamic
关键字后期绑定的
Document doc = GetActiveDocument();
if ( doc != null )
{
dynamic properties = doc.CustomDocumentProperties;
foreach (dynamic p in properties)
{
Console.WriteLine( p.Name + " " + p.Value);
}
}
Answer 3:
我找到了解决办法在这里 。
下面是我最终的代码:
public void SetDocumentProperty(string propertyName, string propertyValue)
{
object oDocCustomProps = workBk.CustomDocumentProperties;
Type typeDocCustomProps = oDocCustomProps.GetType();
object[] oArgs = {propertyName,false,
MsoDocProperties.msoPropertyTypeString,
propertyValue};
typeDocCustomProps.InvokeMember("Add", BindingFlags.Default |
BindingFlags.InvokeMethod, null,
oDocCustomProps, oArgs);
}
private object GetDocumentProperty(string propertyName, MsoDocProperties type)
{
object returnVal = null;
object oDocCustomProps = workBk.CustomDocumentProperties;
Type typeDocCustomProps = oDocCustomProps.GetType();
object returned = typeDocCustomProps.InvokeMember("Item",
BindingFlags.Default |
BindingFlags.GetProperty, null,
oDocCustomProps, new object[] { propertyName });
Type typeDocAuthorProp = returned.GetType();
returnVal = typeDocAuthorProp.InvokeMember("Value",
BindingFlags.Default |
BindingFlags.GetProperty,
null, returned,
new object[] { }).ToString();
return returnVal;
}
有些异常处理是必要的手,如果检索时犯规存在财产
Answer 4:
后期这个问题的答案,但我制定了一个简单的方法添加,可能是使用的人在未来的定制DocumentProperties。
我的问题是,与调用()由System.String.GetType提供的系统类型的Add()方法引发了收到COMException:类型不匹配。 参照在以前的答案的链接很明显,这种方法需要一个Office特定类型,这样结束了,我的工作是代码:
var custProps = (Office.DocumentProperties)this.CustomDocumentProperties;
custProps.Add( "AProperty", false, MsoDocProperties.msoPropertyTypeString, "AStringProperty" );
因为它是一个CustomDocumentProperty办公室将添加自定义属性没有困难,但如果你需要检查是否存在或验证的值时CustomDocumentProperty可能不存在,你必须赶上System.ArgumentException。
编辑
正如奥利弗·博克的评论指出,这是一个Office 2007和仅占解决方案,据我所知。
文章来源: Accessing Excel Custom Document Properties programmatically