我正在尝试使用Open XML C#库以Microsoft Word模板形式设置复选框的值。我想出了如何在表单上设置文本输入的方法,但是我一直试图使复选框起作用,这是我目前在这里的位置:
我创建了一个名为formItems
的C#列表,它具有两个属性:FormField
是单词书签名称,例如“ author”,而FormData
是数据,例如“ John Smith”。因此,对于一个复选框,该项目为formItem.FormField = authorcheckbox
和formItem.FormData = checked
。我在SO上找到了一个答案,该答案说使用名为SetCheckboxValue()
的自定义方法,我还将在下面显示它:
using (WordprocessingDocument document = WordprocessingDocument.Open(filename, true))
{
document.ChangeDocumentType(WordprocessingDocumentType.Document);
MainDocumentPart mainPart = document.MainDocumentPart;
var fields = mainPart.Document.Body.Descendants<FormFieldData>();
foreach (var formItem in formItems)
{
if (!String.IsNullOrWhiteSpace(formItem.Data))
{
FormFieldData input = fields.Where(field => ((FormFieldName)field.FirstChild).Val.InnerText == formItem.FormField).FirstOrDefault();
if (input != null && !formItem.FormField.Contains("checkbox"))
{
TextInput text = input.Descendants<TextInput>().First();
SetFormFieldValue(text, formItem.Data);
}
else
{
SetCheckBoxValue(input, true);
}
}
}
SetCheckboxValue方法:
private static void SetCheckBoxValue(OpenXmlElement field, bool isChecked)
{
field.Parent.Parent.FirstChild.GetFirstChild<SdtContentCheckBox>().Checked.Val = isChecked ? OnOffValues.True : OnOffValues.False;
field.Parent.Parent.Descendants<Run>().First().GetFirstChild<Text>().Text = isChecked ? "☒" : "☐";
}
运行此方法时,它在SetCheckboxValue
的第一行显示以下错误:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
DocumentFormat.OpenXml.OpenXmlElement.GetFirstChild<T>(...) returned null.