簡體   English   中英

使用 OpenXML 以編程方式將復選框內容控件添加到 Word 文檔

[英]Programmatically add Checkbox Content Controls to Word document using OpenXML

是否有一種簡單/直接的方法可以在 .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開發工具包

第一個只展示了如何添加文本內容控件,第二個直接導致 .docx 文件損壞。

任何幫助將不勝感激!

我能找到的最接近的工作代碼是這樣的:

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 控件),但至少它是一個開始!

如果有人知道如何添加復選框內容控件,請隨時在下面發表回復,我會將其標記為正確。

即使你自己找到了答案,我還是把它留在這里,以防有人偶然發現這個尋找相關的東西。

有一個名為 Open XML SDK 2.5 Productivity Tool 的工具,您可以從 這里下載,它允許您對 word .docx 文檔進行逆向工程,以獲取 C# 代碼以從頭開始生成它。

為了獲得您正在尋找的代碼以生成任何類型的單詞元素(復選框、表格、項目符號列表...),您需要使用所述元素創建一個單詞文檔並保存它。

然后,使用 Open XML SDK 2.5 Productivity Tool 打開它並單擊“Reflect Code”按鈕。 生成的代碼將向您展示如何創建這些元素、樣式和其他格式。

有了這個,我得到了獲取帶有復選框的段落所需的代碼

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM