9

如何使用 OpenXML 获得嵌入在 Word 文档中的 CheckBox 控件的句柄?

您会认为 Paragraph.ControlPropertiesPart 或 Paragraph.Descendents() 会有所作为,但在每种情况下,我都会返回一个 null 类型。

我可以使用实际的 XML 结构遍历文档树,但这似乎很麻烦。

欢迎提出建议。

4

1 回答 1

12

下面的代码显示了如何使用文档Decendants<CheckBox>()正文中的方法枚举 word 文档中的所有复选框。

using (WordprocessingDocument doc = WordprocessingDocument.Open("c:\\temp\\checkbox.docx", true))
{
  foreach (CheckBox cb in doc.MainDocumentPart.Document.Body.Descendants<CheckBox>())
  {
    Console.Out.WriteLine(cb.LocalName);

    FormFieldName cbName = cb.Parent.ChildElements.First<FormFieldName>();
    Console.Out.WriteLine(cbName.Val);

    DefaultCheckBoxFormFieldState defaultState = cb.GetFirstChild<DefaultCheckBoxFormFieldState>();
    Checked state = cb.GetFirstChild<Checked>();

    Console.Out.WriteLine(defaultState.Val.ToString());

    if (state.Val == null) // In case checkbox is checked the val attribute is null
    {
      Console.Out.WriteLine("CHECKED");
    }
    else
    {
      Console.Out.WriteLine(state.Val.ToString());
    }
  }
}

要确定给定复选框输入元素的名称,您必须访问实例的 Parent属性,CheckBox然后搜索该FormFieldName元素(要为复选框指定名称,请使用 Microsoft Word 中的属性对话框)。

DefaultCheckBoxFormFieldState Val属性保存复选框的默认状态。此外,元素的Val属性保存实例Checked的实际检查状态。CheckBox注意,对于 Microsoft Word 2007,Val 属性是null复选框是否被选中。

开始编辑

我想扩展我的答案。事实上,MS Word 开发人员选项卡上有两种复选框控件 - 传统复选框和 ActiveX 控件复选框。上面显示的代码可用于枚举 Word 文档中的旧复选框(有关如何创建旧复选框,请参阅本文)。

据我所知,您不能使用 OpenXML SDK 来获取/设置 ActiveX 复选框的值。但是,您可以使用以下代码枚举 ActiveX 控件:

foreach (Control ctrl in doc.MainDocumentPart.Document.Body.Descendants<Control>())
{
   Console.Out.WriteLine(ctrl.Id);
   Console.Out.WriteLine(ctrl.Name);
   Console.Out.WriteLine(ctrl.ShapeId);
}

要确定给定Control是否是一个复选框,您必须检查Control. 复选框的类 ID 是{8BD21D40-EC42-11CE-9E0D-00AA006002F3}。这是获取类ID的代码示例(我不知道是否有更简单的方法...):

OpenXmlPart part = doc.MainDocumentPart.GetPartById(ctrl.Id);
OpenXmlReader re = OpenXmlReader.Create(part.GetStream());
re.Read();
OpenXmlElement el = re.LoadCurrentElement();          
if(el.GetAttribute("classid", el.NamespaceUri).Value == "{8BD21D40-EC42-11CE-9E0D-00AA006002F3}")
{
  Console.WriteLine("Checkbox found...");
}
re.Close();

结束编辑

编辑 2

我没有意识到 Word 2010 中有一个新的复选框控件(感谢 Dennis Palmer)。

要枚举这些新的复选框控件,您可以使用以下代码:

using (WordprocessingDocument doc = WordprocessingDocument.Open(filename, true))
{
   MainDocumentPart mp = doc.MainDocumentPart;

   foreach(SdtContentCheckBox cb in mp.Document.Body.Descendants<SdtContentCheckBox>())
   {         
     if(cb.Checked.Val == "1");
     {
       Console.Out.WriteLine("CHECKED");  
     }           
   }
}

结束编辑 2

希望这可以帮助。

于 2011-12-04T13:47:29.390 回答