如何使用Word 2010文档中的OpenXML SDK解锁内容控件?

时间:2012-05-23 21:55:11

标签: ms-word openxml openxml-sdk

我在服务器端操作Word 2010文档,文档中的某些内容控件检查了以下锁定属性

  • 无法删除内容控制
  • 无法编辑内容

有人可以建议将这些锁定选项设置为false,或者使用OpenXML SDK完全删除吗?

2 个答案:

答案 0 :(得分:5)

openxml SDK提供Lock类和LockingValues枚举 用于以编程方式设置选项:

  • 无法删除内容控制
  • 无法编辑内容

因此,要将这两个选项设置为“false”(LockingValues.Unlocked), 搜索文档中的所有SdtElement元素并将Val属性设置为 LockingValues.Unlocked

以下代码显示了一个示例:

static void UnlockAllSdtContentElements()
{
  using (WordprocessingDocument wordDoc =
    WordprocessingDocument.Open(@"c:\temp\myword.docx", true))
  {        
    IEnumerable<SdtElement> elements = 
      wordDoc.MainDocumentPart.Document.Descendants<SdtElement>();

    foreach (SdtElement elem in elements)
    {
      if (elem.SdtProperties != null)
      {
        Lock l = elem.SdtProperties.ChildElements.First<Lock>();

        if (l == null)
        {              
          continue;
        }

        if (l.Val == LockingValues.SdtContentLocked)
        {
          Console.Out.WriteLine("Unlock content element...");
          l.Val = LockingValues.Unlocked;
        }
      }
    }
  }
}

static void Main(string[] args)
{
  UnlockAllSdtContentElements();
}

答案 1 :(得分:1)

仅针对复制此代码的人,请记住,如果没有与内容控件关联的锁,则不会有与之关联的Lock属性,因此当代码执行以下指令时,将返回异常,因为找不到元素:

锁定l = elem.SdtProperties.ChildElements.First();

解决这个问题的方法是使用FirstOrDefault而不是First。