【问题标题】:Programmatically add Checkbox Content Controls to Word document using OpenXML使用 OpenXML 以编程方式将复选框内容控件添加到 Word 文档
【发布时间】:2018-04-16 08:46:20
【问题描述】:

是否有一种简单/直接的方法可以在 .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 文件损坏。

任何帮助将不胜感激!

【问题讨论】:

  • 来吧伙计们,我不敢相信没有人想以编程方式添加可点击的复选框!

标签: checkbox ms-word openxml dynamic-content


【解决方案1】:

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

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;  
    } 

使用它我能够动态添加 Legacy Checkboxes(即既不是 Content 控件也不是 ActiveX 控件),但至少这是一个开始!

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

【讨论】:

    【解决方案2】:

    即使你自己找到了答案,我也会把它留在这里,以防有人偶然发现这个寻找相关的东西。

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

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

    然后,使用 Open XML SDK 2.5 Productivity Tool 打开它并单击“反映代码”按钮。生成的代码将向您展示如何创建这些元素、样式和其他格式。

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多