Заполните данные шаблона слова, используя openXML SDK - PullRequest
0 голосов
/ 20 января 2019

У меня есть шаблон файла слова и файл XML для данных.Я хочу найти контент Контент Контент в слове и получить данные из XML, а затем заменить текст в шаблоне Word.Я использую следующий код, но он не обновляет файл слов.

using (WordprocessingDocument document = WordprocessingDocument.CreateFromTemplate(txtWordFile.Text))       
{
           MainDocumentPart mainPart = document.MainDocumentPart;
            IEnumerable<SdtBlock> block = mainPart.Document.Body.Descendants<SdtBlock>().Where
                (r => r.SdtProperties.GetFirstChild<Tag>().Val == "TotalClose");
            Text t = block.Descendants<Text>().Single();
             t.Text = "13,450,542";
            mainPart.Document.Save();
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Базовый подход, который вы используете, работает нормально, но я удивлен, что вы не получаете никаких ошибок во время компиляции, потому что

IEnumerable<SdtBlock> block = mainPart.Document.Body.Descendants<SdtBlock>().Where
            (r => r.SdtProperties.GetFirstChild<Tag>().Val == "TotalClose");

не совместимо с

Text t = block.Descendants<Text>().Single();

block, так как IEnumberable не имеет свойства Descendants.Вам либо нужно перебрать все элементы в IEnumerable и выполнить это для каждого элемента, либо вам нужно определить и создать экземпляр одного элемента, например:

    using (WordprocessingDocument document = WordprocessingDocument.CreateFromTemplate(txtWordFile.Text))
    {
        MainDocumentPart mainPart = pkgDoc.MainDocumentPart;
        SdtBlock block = mainPart.Document.Body.Descendants<SdtBlock>().Where
            (r => r.SdtProperties.GetFirstChild<Tag>().Val == "test1").FirstOrDefault();
        Text t = block.Descendants<Text>().Single();
        t.Text = "13,450,542";
        mainPart.Document.Save();
     }
0 голосов
/ 20 января 2019

Я думаю, вы должны записать изменения во временный файл. См. Сохранение измененного WordprocessingDocument в новый файл или мой код из рабочего проекта:

    MemoryStream yourDocStream = new MemoryStream();
    ... // populate yourDocStream with .docx bytes
    using (Package package = Package.Open(yourDocStream, FileMode.Open, FileAccess.ReadWrite))
    {
        //  Load the document XML in the part into an XDocument instance.  
        PackagePart packagePart = LoadXmlPackagePart(package);
        XDocument xDocument = XDocument.Load(XmlReader.Create(packagePart.GetStream()));

        // making changes

        //  Save the XML into the package  
        using (XmlWriter xw = XmlWriter.Create(packagePart.GetStream(FileMode.Create, FileAccess.Write)))
        {
            xDocument.Save(xw);
        }

        var resultDocumentBytes = yourDocStream.ToArray();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...