Как установить значение флажка Microsoft Word, используя Open XML в C #? - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь установить значение флажка в форме шаблона 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.
...