- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何使用 OpenXML 获取嵌入在 Word 文档中的 CheckBox 控件的句柄?
您可能认为 Paragraph.ControlPropertiesPart 或 Paragraph.Descendents() 会有所作为,但在每种情况下我都会返回一个空类型。
我可以使用实际的 XML 结构向下遍历文档树,但这看起来很麻烦。
欢迎提出建议。
最佳答案
下面的代码显示了如何枚举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());
}
}
}
要确定给定复选框输入元素的名称,您必须访问 Parent
CheckBox
的属性(property)实例,然后搜索 FormFieldName
元素(使用 Microsoft Word 中的属性对话框为复选框指定名称)。
DefaultCheckBoxFormFieldState
Val
属性保存复选框的默认状态。此外 Val
Checked
的属性(property)元素保存实际检查状态的 CheckBox
实例。请注意,对于 Microsoft Word 2007,Val 属性为 null
如果复选框已选中。
开始编辑
我想扩展我的答案。事实上,MS Word 开发人员选项卡上有两种复选框控件 - 旧式复选框和 ActiveX 控件复选框。上面显示的代码可用于枚举 word 文档中的遗留复选框(请参阅此 article,了解如何创建遗留复选框)。
据我所知,您不能使用 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");
}
}
}
结束编辑 2
希望这对您有所帮助。
关于c# - 使用 OpenXML 在 Word 中获取复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8336350/
我是一名优秀的程序员,十分优秀!