访问Excel自定义文档属性编程(Accessing Excel Custom Document P

2019-06-14 17:13发布

我想自定义属性添加到我已编程方式创建一个工作簿。 我对获取和设置属性到位的方法,但问题是该工作簿为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