title: Accessing Excel Custom Document Properties programmatically
body: <p>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</p>
  
  <pre><code>if(workbook.CustomDocumentProperties == null)
      workbook.CustomDocumentProperties = new DocumentProperties;
  </code></pre>
  
  <p>Here is the code I have to get and set the properties:</p>
  
  <pre><code>     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 &amp;&amp; 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);
  
      }
  </code></pre>
  
  <p>The line
      properties = workBk.CustomDocumentProperties as DocumentProperties;
  always set properties to null.</p>
  
  <p>This is using Microsoft.Office.Core v12.0.0.0 and Microsoft.Office.Interop.Excell v12.0.0.0 (Office 2007)</p>