使用OpenXML在Word中获取复选框

本文关键字:获取 复选框 Word OpenXML 使用 | 更新日期: 2023-09-27 18:16:22

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

你会认为段落。ControlPropertiesPart或段落后裔()将实现的东西,但在每一个单一的情况下,我得到一个空类型返回。

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

建议欢迎。

使用OpenXML在Word中获取复选框

下面的代码显示了如何枚举word文档中的所有复选框

使用Decendants<CheckBox>()方法。
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());
    }
  }
}

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

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

开始编辑

我想扩展我的回答。实际上,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。复选框的类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)帕尔默)。

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

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");  
     }           
   }
}

END EDIT 2

希望有帮助。