Phi*_*ler 8 c# openxml office-2010 wordprocessingml
如何使用OpenXML获取嵌入在Word文档中的CheckBox控件的句柄?
您会认为Paragraph.ControlPropertiesPart或Paragraph.Descendents()会实现某些功能,但在每种情况下我都会返回null类型.
我可以使用实际的XML结构遍历文档树,但这似乎很麻烦.
建议欢迎.
Han*_*ans 10
下面的代码显示了如何使用Decendants<CheckBox>()docuement主体上的方法枚举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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
要确定给定复选框输入元素的名称,您必须访问该实例的
Parent属性,CheckBox然后搜索该FormFieldName元素(要为复选框指定名称,请使用Microsoft Word中的"属性"对话框).
该DefaultCheckBoxFormFieldState Val属性保持复选框的默认状态.此外,元素的Val属性Checked保持CheckBox实例的实际检查状态.请注意,对于Microsoft Word 2007,Val属性是null选中复选框.
开始编辑
我想扩展我的答案.事实上,MS Word开发人员选项卡上有两种复选框控件 - 遗留复选框和ActiveX控件复选框.上面所示的代码可用于enumerte遗留复选框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);
}
Run Code Online (Sandbox Code Playgroud)
要确定给定Control是否是复选框,您必须查看该类的ID 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();
Run Code Online (Sandbox Code Playgroud)
结束编辑
编辑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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
结束编辑2
希望这可以帮助.