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

时间:2017-11-03 15:04:44

标签: checkbox ms-word openxml dynamic-content

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

我尝试在这样的新段落之后添加一个 SdtContentCheckBox ,但没有运气:

newParagraph.Append(new SdtContentCheckBox());

并按照此处的说明操作: https://www.codeproject.com/Tips/370758/Add-dynamic-content-controls-to-a-word-document和此处:How do I create a check box in C# using Open XML SDK

第一个仅显示如何添加文本内容控件,第二个直接显示导致损坏的.docx文件。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

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

https://social.msdn.microsoft.com/Forums/office/en-US/f6ce8ecf-0ed8-4f18-958a-a086f212d1e2/how-to-create-a-checked-checkbox-form-field-using-the-sdk?forum=oxmlsdk

public static Paragraph GenerateParagraph()  
    {  
        var element =   
            new Paragraph(  
                new Run(  
                    new FieldChar(  
                        new FormFieldData(  
                            new FormFieldName(){ Val = "Check1" },  
                            new Enabled(),  
                            new CalculateOnExit(){ Val = BooleanValues.Zero },  
                            new CheckBox(  
                                new AutomaticallySizeFormField(),  
                                new DefaultCheckboxFormFieldState(){ Val = BooleanValues.Zero }))  
                    ){ FieldCharType = FieldCharValues.Begin }),  
                new BookmarkStart(){ Name = "Check1", Id = 0 },  
                new Run(  
                    new FieldCode(" FORMCHECKBOX "){ Space = "preserve" }),  
                new Run(  
                    new FieldChar(){ FieldCharType = FieldCharValues.End }),  
                new BookmarkEnd(){ Id = 0 },  
                new Run(  
                    new Text("My check box"))  
            ){ RsidParagraphAddition = "00784880", RsidRunAdditionDefault = "00B77989" };  
        return element;  
    } 

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

如果有人知道如何添加Checkbox内容控件,请随时在下方发布回复,并将其标记为正确。

答案 1 :(得分:-1)

即使您找到了答案,我还是把它留在这里,以防万一有人偶然发现与此相关的东西。

有一个名为Open XML SDK 2.5 Productivity Tool的工具,您可以从here下载该工具,该工具使您可以对Word .docx文档进行反向工程,以获取C#代码以从头开始生成它。

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

然后,使用Open XML SDK 2.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;
}