0
votes

I'm writing a library which generates Word documents based on a template. Some text needs to be replaced with another text. Everything seems to be working, there is a TextReplacer class which may perform replacements.

The things become worse when I need to replace a single-line part of text with multiline text. Line breaks such as \n or \r\n are just pasted as text. I understand that this is expected as multiple lines of text must become separate tags (<w.p>..</w.p>, I suppose) in document.xml.

I think that simple solution is to replace all \n or \r\n in document with break tags before saving. I can do this with string.Replace(), but I don't think it is the best way to go. I want to use some built-in OpenXMLPowerTools library features, if it is possible. Or maybe other (free) OpenXML libraries.

1
Im not sure if this is any help stackoverflow.com/questions/2871887/… - NickOS
@NickRobins, yes, it might be the solution, but not a built-in functionality. I might perform replacement by hand, I'm just afraid it will fall with large amounts of text. - Anton Papin

1 Answers

2
votes

I ended up with this:

public static void ReplaceNewLinesWithBreaks(XDocument xDoc)
{
    var textWithBreaks = xDoc.Descendants(W.t).Where(t => t.Value.Contains("\\r\\n"));
    foreach (var textWithBreak in textWithBreaks)
    {
        var text = textWithBreak.Value;
        var split = text.Replace("\\r\\n", "\\n").Split(new[] {"\\n"}, StringSplitOptions.None);

        textWithBreak.Value = string.Empty;
        foreach (var s in split)
        {
            textWithBreak.Add(new XElement(W.t, s));
            textWithBreak.Add(new XElement(W.br));
        }
        textWithBreak.Descendants(W.br).Last().Remove();
    }
}

Which may be also rewritten as helper method.

But, it would be great if someone from OpenXmlPowerTools team will write an overload to TextReplacer which would accept IEnumerables for replacement.