Как я могу поместить содержимое в поля DOCVARIABLE в DOCX - PullRequest
0 голосов
/ 31 марта 2019

Как установить значение в таких полях, как {DOCVARIABLE SomeName \* MERGEFORMAT} в документе MS Word через OpenXML?

1 Ответ

0 голосов
/ 17 апреля 2019

Переменные документа хранятся как DocumentVariable в элементе DocumentVariables внутри Настройки в DocumentSettingsPart

Таким образом, вы можете получить переменную Document следующим образом:

    /// <summary>
    /// Retrieves a document variable by its name
    /// </summary>
    /// <param name="name">The name of the document variable (case sensitive)</param>
    /// <param name="document">The wordprocessing document</param>
    /// <returns>The document variable if found, other wise it returns null</returns>
    public DocumentVariable GetVariableByName(string name, WordprocessingDocument document)
    {
        // Get the document settings part
        DocumentSettingsPart documentSettings = document.MainDocumentPart.DocumentSettingsPart;
        // Get the settings element
        Settings settings = documentSettings.Settings;
        // Get the DocumentVariables element
        DocumentVariables variables = settings.Elements<DocumentVariables>().FirstOrDefault();
        // check if the variables are not null
        if(variables != null)
        {
            return variables.Elements<DocumentVariable>().Where(v => v.Name == name)
                .FirstOrDefault();
        }
        return null;
    }

Когда вы получили переменную, вы можете изменить значение переменной следующим образом:

    /// <summary>
    /// Sets the value of a document variable
    /// </summary>
    /// <param name="variable">The variable</param>
    /// <param name="value">The value</param>
    public void SetDocumentVariableValue(DocumentVariable variable, string value)
    {
        variable.Val = value;
    }

Собрав все это вместе вВ простой консольной программе значение переменной документа внутри документа WordProcessing можно изменить следующим образом:

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using System.Linq;

namespace ChangeDocVariable
{
    class Program
    {
        /// <summary>
        /// Retrieves a document variable by its name
        /// </summary>
        /// <param name="name">The name of the document variable (case sensitive)</param>
        /// <param name="document">The wordprocessing document</param>
        /// <returns>The document variable if found, other wise it returns null</returns>
        public static DocumentVariable GetVariableByName(string name, WordprocessingDocument document)
        {
            // Get the document settings part
            DocumentSettingsPart documentSettings = document.MainDocumentPart.DocumentSettingsPart;
            // Get the settings element
            Settings settings = documentSettings.Settings;
            // Get the DocumentVariables element
            DocumentVariables variables = settings.Elements<DocumentVariables>().FirstOrDefault();
            // check if the variables are not null
            if(variables != null)
            {
                return variables.Elements<DocumentVariable>().Where(v => v.Name == name)
                    .FirstOrDefault();
            }
            return null;
        }

        /// <summary>
        /// Sets the value of a document variable
        /// </summary>
        /// <param name="variable">The variable</param>
        /// <param name="value">The value</param>
        public static void SetDocumentVariableValue(DocumentVariable variable, string value)
        {
            variable.Val = value;
        }

        static void Main(string[] args)
        {
            string path = @"This should be the path to your document";

            using(WordprocessingDocument document = WordprocessingDocument.Open(path, true))
            {
                DocumentVariable variable = GetVariableByName("TestVariable", document);
                if(variable != null)
                    SetDocumentVariableValue(variable, "New Value");
                // Or access the value directly
                // variable.Val = "New Value";
                document.Save();
            }
        }
    }
}
...