以编程方式访问Excel自定义文档属性
我试图将自定义属性添加到我已经编程创build的工作簿。 我有一个方法来获取和设置属性,但问题是工作簿正在为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); }
Document属性的行属性= workBk.CustomDocumentProperties; 总是将属性设置为null。
这是使用Microsoft.Office.Core v12.0.0.0和Microsoft.Office.Interop.Excell v12.0.0.0(Office 2007)
我看着我自己的代码,可以看到我使用后期绑定访问属性。 我不记得为什么,但我会张贴一些代码,以防万一。
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关键字 – 是一个更好的解决scheme(如果您重视使用dynamic
性能开销的易用性)。
如果您要定位.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); } }
我在这里find了解决scheme。
这是我最终的代码:
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; }
如果检索时属性不存在,则需要处理一些exception处理
这个问题的答案很晚,但是我想出了一个更简单的方法来添加自定义的DocumentProperties,这些方法可能对将来的某个人有用。
我的问题是用System.String.GetType()提供的Systemtypes调用Add()方法触发了一个COMException:types不匹配。 参考前面的回答中的链接,很明显,这个方法需要一个Office特定的types,所以最终为我工作的代码是:
var custProps = (Office.DocumentProperties)this.CustomDocumentProperties; custProps.Add( "AProperty", false, MsoDocProperties.msoPropertyTypeString, "AStringProperty" );
因为这是一个CustomDocumentProperty Office将毫无困难地添加自定义属性,但是如果您需要检查存在或validationCustomDocumentProperty可能不存在时的值,您将不得不捕获一个System.ArgumentException。
编辑
正如Oliver Bock的评论所指出的,据我所知,这是Office 2007和唯一的解决scheme。