Замена текста в документе Word с использованием .NET Core

#.net-core #openxml #openxml-sdk

#.net-core #openxml #openxml-sdk

Вопрос:

У меня есть документ Word, в котором мне нужно заменить определенные переменные-заполнители фактическими данными с использованием .NET Core.

Это тестовый документ, с которым я работаю. Как вы можете видеть, в настоящее время он имеет две переменные-заполнители.

введите описание изображения здесь

Код , который я должен прочитать документ Word и заменить текст , взят из MSDN с помощью WordprocessingDocument .

 await using var stream = new MemoryStream();

stream.Write(template.Blob, 0, template.Blob.Length);
using (var wordDoc = WordprocessingDocument.Open(stream, true))
{
    if (wordDoc.MainDocumentPart == null)
    {
        return null;
    }

    string docText;
    using (var sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
    {
        docText = await sr.ReadToEndAsync();
    }

    // Test replacing a variable
    Regex regexText = new Regex("{{Building_Current_Version}}");
    docText = regexText.Replace(docText, "Some Value");

    await using (var sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
    {
        await sw.WriteAsync(docText);
    }
}
 

Но это не работает, потому docText что выходные данные отформатированы следующим образом:

 <w:r w:rsidR="00287CAD">
    <w:rPr>
        <w:lang w:val="en-US"/>
    </w:rPr>
    <w:br/>
    <w:t>{{</w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r w:rsidR="00287CAD">
    <w:rPr>
        <w:lang w:val="en-US"/>
    </w:rPr>
    <w:t>Building_Current_Version</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r w:rsidR="00287CAD">
    <w:rPr>
        <w:lang w:val="en-US"/>
    </w:rPr>
    <w:t>}}</w:t>
</w:r>
<w:r w:rsidR="00287CAD">
    <w:rPr>
        <w:lang w:val="en-US"/>
    </w:rPr>
    <w:br/>
    <w:t>{{</w:t>
</w:r>
<w:proofErr w:type="spellStart"/>
<w:r w:rsidR="00287CAD">
    <w:rPr>
        <w:lang w:val="en-US"/>
    </w:rPr>
    <w:t>Building_Current_ValidUntil</w:t>
</w:r>
<w:proofErr w:type="spellEnd"/>
<w:r w:rsidR="00287CAD">
    <w:rPr>
        <w:lang w:val="en-US"/>
    </w:rPr>
    <w:t>}}</w:t>
</w:r>
 

По какой-то причине скобки помещаются в отдельные теги XML. Но иногда это не так. Иногда это также разбивает переменную на отдельные теги XML. Я не добавляю никакого форматирования к текстам.

Похоже, что простая замена строки здесь не работает… Если нет способа сообщить Word, чтобы не разделять переменные в отдельных XML-тегах?

Как я могу решить эту проблему?