使用 OpenXML 以编程方式将复选框内容控件添加到 Word 文档
Programmatically add Checkbox Content Controls to Word document using OpenXML
是否有 easy/straightforward 方法在 .docx 文档正文中动态 添加 (不编辑其值)多个复选框控件?
我尝试在像这样的新段落之后附加一个 SdtContentCheckBox 但没有成功:
newParagraph.Append(new SdtContentCheckBox());
并按照此处的说明进行操作:
https://www.codeproject.com/Tips/370758/Add-dynamic-content-controls-to-a-word-document and here: How do I create a check box in C# using Open XML SDK
第一个只展示了如何添加文本内容控件,而第二个直接导致了损坏的 .docx 文件。
如有任何帮助,我们将不胜感激!
我能找到的最接近工作代码是这样的:
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 控件),但至少这是一个开始!
如果有人知道如何添加复选框内容控件,请随时post在下方回复,我会将其标记为正确。
即使您自己找到了答案,我也会把它留在这里,以防有人在寻找相关内容时偶然发现它。
有一个名为 Open XML SDK 2.5 Productivity Tool 的工具,您可以从 here 下载它,它允许您对 word .docx 文档进行逆向工程以获取 C# 代码来生成它从头开始。
为了获得您正在寻找的代码来生成任何类型的单词元素(复选框、table、项目符号列表...),您需要创建一个 word 文档说元素并保存它。
然后,使用打开 XML SDK 2.5 生产力工具打开它并单击 "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;
}
是否有 easy/straightforward 方法在 .docx 文档正文中动态 添加 (不编辑其值)多个复选框控件?
我尝试在像这样的新段落之后附加一个 SdtContentCheckBox 但没有成功:
newParagraph.Append(new SdtContentCheckBox());
并按照此处的说明进行操作: https://www.codeproject.com/Tips/370758/Add-dynamic-content-controls-to-a-word-document and here: How do I create a check box in C# using Open XML SDK
第一个只展示了如何添加文本内容控件,而第二个直接导致了损坏的 .docx 文件。
如有任何帮助,我们将不胜感激!
我能找到的最接近工作代码是这样的:
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 控件),但至少这是一个开始!
如果有人知道如何添加复选框内容控件,请随时post在下方回复,我会将其标记为正确。
即使您自己找到了答案,我也会把它留在这里,以防有人在寻找相关内容时偶然发现它。
有一个名为 Open XML SDK 2.5 Productivity Tool 的工具,您可以从 here 下载它,它允许您对 word .docx 文档进行逆向工程以获取 C# 代码来生成它从头开始。
为了获得您正在寻找的代码来生成任何类型的单词元素(复选框、table、项目符号列表...),您需要创建一个 word 文档说元素并保存它。
然后,使用打开 XML SDK 2.5 生产力工具打开它并单击 "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;
}