如何使用OpenXML获取嵌入在Word文档中的CheckBox控件句柄?
你可能认为Paragraph.ControlPropertiesPart或Paragraph.Descendents()可以实现这一点,但在每一个情况下我都返回了null类型。
我可以使用实际的XML结构遍历文档树,但这似乎很麻烦。
欢迎提供建议。
如何使用OpenXML获取嵌入在Word文档中的CheckBox控件句柄?
你可能认为Paragraph.ControlPropertiesPart或Paragraph.Descendents()可以实现这一点,但在每一个情况下我都返回了null类型。
我可以使用实际的XML结构遍历文档树,但这似乎很麻烦。
欢迎提供建议。
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());
}
}
}
CheckBox
实例的Parent
属性,然后搜索FormFieldName
元素(要为复选框分配名称,请使用Microsoft Word中的属性对话框)。
DefaultCheckBoxFormFieldState
Val
属性保存复选框的默认状态。此外,Checked
元素的Val
属性保存CheckBox
实例的实际选中状态。请注意,对于Microsoft Word 2007,如果复选框已选中,则Val
属性为null
。
BEGIN EDIT
我想扩展我的答案。实际上,在MS Word开发人员选项卡上有两种复选框控件-传统复选框和ActiveX控件复选框。上面显示的代码可用于枚举文档中的传统复选框(请参见这个article以了解如何创建传统复选框)。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 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
希望这有所帮助。