Запись полей словоформы с помощью DocumentFormat.OpenXML SDK

Я пишу приложение, которое должно использовать SDK DocumentFormat.OpenXML для записи данных для формирования полей в шаблоне слова. Но я не могу найти свойство в объекте документа SDK, где хранятся поля формы.

Я пробовал этот код:

using (WordprocessingDocument document = WordprocessingDocument.Open("Path/To/document.dotx", true))
{
    document.ChangeDocumentType(DocumentFormat.OpenXml.WordprocessingDocumentType.Document);
    MainDocumentPart mainPart = document.MainDocumentPart;

    var fields = mainPart.Document.Body.Descendants<FormFieldData>();

    foreach (var field in fields)
    {
        if (field.GetType() == typeof(FormFieldData))
        {
            if (field.LocalName == "Name")
            {
                Console.WriteLine("Hi!");
            }   
        }
     }
}

Но поля всегда нулевые.


person Philipp Eger    schedule 09.06.2015    source источник
comment
См. stackoverflow.com/questions/29287844/   -  person Stein-Tore Erdal    schedule 17.10.2016


Ответы (2)


Вы можете сделать это, заменив эту строку:

if (field.LocalName == "Name")

с этим:

if (((FormFieldName)field.FirstChild).Val.InnerText.Equals("Name"))

Кроме того, вы можете использовать следующий код, чтобы поместить текст внутри элемента поля формы, используя функцию SetFormFieldValue, предоставленную в другом ответе SO:

        if (((FormFieldName)field.FirstChild).Val.InnerText.Equals("Name"))
        {
            TextInput text = field.Descendants<TextInput>().First();
            SetFormFieldValue(text, "Put some text inside the field");
        }

См. Записывать данные в элементы TextInput в документах docx с помощью OpenXML 2.5 для реализации SetFormFieldValue

person Daniel Bonetti    schedule 25.03.2017

Возможно ли, что ваш документ использует пользовательские свойства для заполнения поля формы? Попробуйте взглянуть на эту страницу MSDN, где объясняется, как читать и управлять пользовательскими свойствами.

person Alkampfer    schedule 02.09.2016