如何在C#中使用Open XML设置Microsoft Word复选框的值?

时间:2018-08-31 04:40:15

标签: c# xml openxml

我正在尝试使用Open XML C#库以Microsoft Word模板形式设置复选框的值。我想出了如何在表单上设置文本输入的方法,但是我一直试图使复选框起作用,这是我目前在这里的位置:

我创建了一个名为formItems的C#列表,它具有两个属性:FormField是单词书签名称,例如“ author”,而FormData是数据,例如“ John Smith”。因此,对于一个复选框,该项目为formItem.FormField = authorcheckboxformItem.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.

0 个答案:

没有答案