OpenXMLを使用して、単語のチェックボックスを取得します
-
26-10-2019 - |
質問
OpenXMLを使用してWordドキュメントに埋め込まれているチェックボックスコントロールのハンドルをどのように取得しますか?
パラグラフのいずれかのparagraph.controlpropertiespartまたはparagraph.descendents()のいずれかが何かを達成すると思うでしょうが、すべての場合にヌルタイプが返されます。
実際のXML構造を使用してドキュメントツリーを横断することができますが、これは面倒です。
提案を歓迎します。
解決
以下のコードは、Wordドキュメントのすべてのチェックボックスを使用して列挙する方法を示しています Decendants<CheckBox>()
Docuementの本体の方法。
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
インスタンスしてから検索します FormFieldName
要素(名前をチェックボックスに割り当てるには、Microsoft Wordの[プロパティ]ダイアログを使用します)。
DefaultCheckBoxFormFieldState
Val
プロパティは、チェックボックスのデフォルト状態を保持します。さらに Val
のプロパティ Checked
要素は、実際にチェックされた状態を保持します CheckBox
実例。注、MicrosoftWord 2007の場合、VALプロパティは null
チェックボックスがチェックされている場合。
編集を開始します
答えを拡張したいのですが。実際、MS Word Developerタブには2種類のチェックボックスコントロールがあります。レガシーチェックボックスと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
あなたがのクラスIDをckeckする必要があるチェックボックスです 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();
編集を終了します
編集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を終了します
お役に立てれば。