使用 OpenXML 在 Word 中获取复选框
如何使用 OpenXML 获取嵌入到 Word 文档中的 CheckBox 控件的句柄?
您可能会认为 Paragraph.ControlPropertiesPart 或 Paragraph.Descendents() 会实现某些目标,但在每种情况下我都会返回 null 类型。
我可以使用实际的 XML 结构遍历文档树,但这看起来很麻烦。
欢迎提出建议。
How does one get a handle to a CheckBox control that's embedded in a Word document using OpenXML?
You would think that either Paragraph.ControlPropertiesPart or Paragraph.Descendents() would achieve something but in every single case I get a null type returned.
I can traverse down the document tree using the actual XML structure, but this seems cumbersome.
Suggestions welcome.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
下面的代码显示了如何枚举Word文档中的所有复选框
在文档主体上使用
Decendants()
方法。要确定给定复选框输入元素的名称,您必须访问
CheckBox
实例的Parent
属性,然后搜索FormFieldName
元素(要为复选框指定名称,请使用 Microsoft Word 中的“属性”对话框) 。DefaultCheckBoxFormFieldState
Val
属性保存复选框的默认状态。此外,
Checked
元素的Val
属性保存实际的选中状态CheckBox
实例的。请注意,对于 Microsoft Word 2007,如果满足以下条件,则 Val 属性为null
:复选框被选中。
开始编辑
我想扩展我的答案。事实上,MS Word 开发人员选项卡上有两种复选框控件 - 传统复选框和 ActiveX 控件复选框。上面显示的代码可用于枚举 Word 文档中的旧复选框(请参阅此 有关如何创建旧复选框的文章)。
据我所知,您无法使用 OpenXML SDK 获取/设置 ActiveX 复选框的值。
不过,您可以使用以下代码枚举 ActiveX 控件:
要确定给定的
Control
是否为复选框,您必须检查Control
的类 ID。复选框的类 ID 为{8BD21D40-EC42-11CE-9E0D-00AA006002F3}
。这是一个获取类ID的代码示例(我不知道是否有更简单的方法...):
END EDIT
EDIT 2
我没有意识到Word 2010 中有一个新的复选框控件(感谢 Dennis
帕尔默)。
要枚举这些新的复选框控件,您可以使用以下代码:
END EDIT 2
希望这会有所帮助。
The code below shows how to enumerate all checkboxes in a word document by
using the
Decendants<CheckBox>()
method on the docuement's body.To determine the name of a given checkbox input element you have to access the
Parent
property of theCheckBox
instance and then search for theFormFieldName
element (to assign a name to a checkbox use the Properties Dialog in Microsoft Word).The
DefaultCheckBoxFormFieldState
Val
property holds the default state for the checkbox.Furthermore the
Val
property of theChecked
element holds the actual checked stateof the
CheckBox
instance. Note, for Microsoft Word 2007 the Val property isnull
ifthe checkbox is checked.
BEGIN EDIT
I'd like to extend my answer. In fact, there are two kinds of checkbox controls on the MS Word developer tab - a legacy checkbox and an ActiveX control checkbox. The code shown above can be used to enumerte legacy checkboxes in a word document (see this article on how to create a legacy checkbox).
As far as I know, you can't use the OpenXML SDK to get/set values for an ActiveX checkbox.
However you can enumerate ActiveX controls using the following code:
To determine whether or not a given
Control
is a checkbox you have to ckeck the class ID of theControl
. The class ID of a checkbox is{8BD21D40-EC42-11CE-9E0D-00AA006002F3}
.Here is a code sample to get the class ID (I don't know if there is an easier way...):
END EDIT
EDIT 2
I didn't realize that there is a new checkbox control in Word 2010 (Thanks to Dennis
Palmer).
To enumerate those new checkbox controls you can use the following code:
END EDIT 2
Hope, this helps.