Я пытаюсь установить значение флажка в форме шаблона Microsoft Word, используя библиотеку Open XML C #. Я выяснил, как настроить ввод текста в форме, но я застрял, пытаясь заставить флажки работать, вот где я сейчас нахожусь:
Я создал список C # с именем formItems
, который имеет два свойства: FormField
, которое представляет собой имя закладки Word, например, "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.