WordprocessingDocument: как заменить определенный текст, заключенный в набор специальных символов? - PullRequest
0 голосов
/ 31 января 2019

Мне нужно сгенерировать несколько текстовых документов на основе шаблона.В каждом документе необходимо заменить определенные строки (все они заключены в двойной набор фигурных скобок, просто чтобы их легко отличить друг от друга).

Я пытался:

** Чтение всего шаблона изаменить все вхождения слова с помощью Regex.Replace

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
    {
        string docText = null;
        using (StreamReader sr = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
            docText = sr.ReadToEnd();

        foreach (var key in keysToSearch)
            docText = new Regex(key, RegexOptions.IgnoreCase).Replace(docText, replaceText);

        using (StreamWriter sw = new StreamWriter(wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
            sw.Write(docText);
    }

** А также получить доступ к каждому элементу Text

using ( WordprocessingDocument doc =
                    WordprocessingDocument.Open(@"yourpath\testdocument.docx", true))
            {
                var body = doc.MainDocumentPart.Document.Body;
                var paras = body.Elements<Paragraph>();

                foreach (var para in paras)
                {
                    foreach (var run in para.Elements<Run>())
                    {
                        foreach (var text in run.Elements<Text>())
                        {
                            if (text.Text.Contains("{{FullName}}"))
                            {
                                text.Text = text.Text.Replace("{{FullName}}", "replaced-text");
                            }
                        }
                     }
                }
          }

Но ни одно из перечисленных выше решений не сработало, потому что в.docx-файлы, все эти фигурные скобки хранятся в разных текстовых элементах (<w:t>):

            <w:r w:rsidR="00786C31" w:rsidRPr="00475C3D">
                <w:rPr>
                    <w:b/>
                    <w:sz w:val="36"/>
                    <w:highlight w:val="yellow"/>
                    <w:lang w:val="es-PE"/>
                </w:rPr>
                <w:t>{{</w:t>
            </w:r>
            <w:proofErr w:type="spellStart"/>
            <w:r w:rsidR="001B7FC4" w:rsidRPr="00475C3D">
                <w:rPr>
                    <w:b/>
                    <w:sz w:val="36"/>
                    <w:highlight w:val="yellow"/>
                    <w:lang w:val="es-PE"/>
                </w:rPr>
                <w:t>FullName</w:t>
            </w:r>
            <w:proofErr w:type="spellEnd"/>
            <w:r w:rsidR="00786C31" w:rsidRPr="00475C3D">
                <w:rPr>
                    <w:b/>
                    <w:sz w:val="36"/>
                    <w:highlight w:val="yellow"/>
                    <w:lang w:val="es-PE"/>
                </w:rPr>
                <w:t>}}</w:t>
            </w:r>

Можно ли каким-либо образом использовать специальные символы для пометки переменной в моих шаблонах, чтобы потом можно было легко найтии заменить их?

1 Ответ

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

Мы используем аналогичные способы для сохранения переменной в документе и последующей ее замены.Некоторый опыт по этому поводу: если вы измените документ и просто сохраните его, то эти символы часто преобразуются, как описано выше.Если вы выберете «Сохранить как», документ будет полностью переписан, и специальные символы останутся.У нас есть хороший опыт работы с двойными символами, как || фамилия ||чтобы сохранить их правильно при использовании метода сохранения как.Знак трубы выглядит не закодированным MS word

...