Checkbox 使用OpenXML以编程方式将复选框内容控件添加到Word文档

Checkbox 使用OpenXML以编程方式将复选框内容控件添加到Word文档,checkbox,ms-word,openxml,dynamic-content,Checkbox,Ms Word,Openxml,Dynamic Content,是否有一种简单/直接的方法可以在.docx文档体中动态添加多个复选框控件(而不是编辑其值) 我尝试在这样一个新段落后添加一个SdtContentCheckBox,但没有成功: newParagraph.Append(new SdtContentCheckBox()); 并遵循以下说明: 在这里: 第一个只演示了如何添加文本内容控件,第二个直接导致.docx文件损坏 任何帮助都将不胜感激 我能找到的最接近的工作代码是: 使用此功能,我可以动态添加传统复选框(即既不是内容控件也不是ActiveX

是否有一种简单/直接的方法可以在.docx文档体中动态添加多个复选框控件(而不是编辑其值)

我尝试在这样一个新段落后添加一个SdtContentCheckBox,但没有成功:

newParagraph.Append(new SdtContentCheckBox());
并遵循以下说明: 在这里:

第一个只演示了如何添加文本内容控件,第二个直接导致.docx文件损坏


任何帮助都将不胜感激

我能找到的最接近的工作代码是:

使用此功能,我可以动态添加传统复选框(即既不是内容控件也不是ActiveX控件),但至少这是一个开始


如果有人知道如何添加复选框内容控件,请随时在下面发布回复,我会将其标记为正确。

即使您自己找到了答案,我也会将此保留在这里,以防任何人在寻找相关内容时偶然发现

有一个名为OpenXMLSDK2.5Productivity tool的工具,您可以从中下载它,它允许您对word.docx文档进行反向工程,以获得从头开始生成的C#代码

为了获得生成任何类型的word元素(复选框、表格、项目符号列表…)所需的代码,您需要使用所述元素创建word文档并保存它

然后,使用OpenXMLSDK2.5生产力工具打开它,并单击“反射代码”按钮。生成的代码将向您展示如何创建包含的元素、样式和其他格式

有了这些,我得到了获得带有复选框的段落所需的代码

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using A = DocumentFormat.OpenXml.Drawing;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;

public static Paragraph GenerateCheckboxParagraph(string internalName, int internalId, string textAfterTextbox)
{
    var run1 = new Run(
            new FieldChar(
                new FormFieldData(
                    new FormFieldName() { Val = internalName },
                    new Enabled(),
                    new CalculateOnExit() { Val = OnOffValue.FromBoolean(false) },
                    new CheckBox(
                        new AutomaticallySizeFormField(),
                        new DefaultCheckBoxFormFieldState() { Val = OnOffValue.FromBoolean(false) }))
            )
            {
                FieldCharType = FieldCharValues.Begin
            }
        );
    var run2 = new Run(new FieldCode(" FORMCHECKBOX ") { Space = SpaceProcessingModeValues.Preserve });
    var run3 = new Run(new FieldChar() { FieldCharType = FieldCharValues.End });
    var run4 = new Run(new Text(textAfterTextbox));

    var element =
        new Paragraph(
            run1,
            new BookmarkStart() { Name = internalName, Id = new StringValue(internalId.ToString()) },
            run2,
            run3,
            new BookmarkEnd() { Id = new StringValue(internalId.ToString()) },
            run4
        );
    return element;
}

来吧,伙计们,我真不敢相信从来没有人想通过编程方式添加可点击的复选框!
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using A = DocumentFormat.OpenXml.Drawing;
using DW = DocumentFormat.OpenXml.Drawing.Wordprocessing;
using PIC = DocumentFormat.OpenXml.Drawing.Pictures;

public static Paragraph GenerateCheckboxParagraph(string internalName, int internalId, string textAfterTextbox)
{
    var run1 = new Run(
            new FieldChar(
                new FormFieldData(
                    new FormFieldName() { Val = internalName },
                    new Enabled(),
                    new CalculateOnExit() { Val = OnOffValue.FromBoolean(false) },
                    new CheckBox(
                        new AutomaticallySizeFormField(),
                        new DefaultCheckBoxFormFieldState() { Val = OnOffValue.FromBoolean(false) }))
            )
            {
                FieldCharType = FieldCharValues.Begin
            }
        );
    var run2 = new Run(new FieldCode(" FORMCHECKBOX ") { Space = SpaceProcessingModeValues.Preserve });
    var run3 = new Run(new FieldChar() { FieldCharType = FieldCharValues.End });
    var run4 = new Run(new Text(textAfterTextbox));

    var element =
        new Paragraph(
            run1,
            new BookmarkStart() { Name = internalName, Id = new StringValue(internalId.ToString()) },
            run2,
            run3,
            new BookmarkEnd() { Id = new StringValue(internalId.ToString()) },
            run4
        );
    return element;
}