Search code examples
c#ms-wordopenxmldocxopenxml-sdk

Using OpenXML SDK to replace text on a docx file with a line break (newline)


I am trying to use C# to replace a specific string of text on an entire DOCX file with a line break (newline).

The string of text that I am searching for could be in a paragraph or in a table in the file.

I am currently using the code below to replace text.

using (WordprocessingDocument doc = WordprocessingDocument.Open("yourdoc.docx", true))
{
  var body = doc.MainDocumentPart.Document.Body;

  foreach (var text in body.Descendants<Text>())
  {
    if (text.Text.Contains("##Text1##"))
    {
      text.Text = text.Text.Replace("##Text1##", Environment.NewLine);
    }
  }
}

ISSUE: When I run this code, the output DOCX file has the text replaced with a space (i.e. " ") instead of a line break.

How can I change this code to make this work?


Solution

  • Try with a break. Check the example on this link. You just have to append a Break

    Paragraphs, smart tags, hyperlinks are all inside Run. So maybe you could try this approach. To change the text inside a table, you will have to use this approach. Again the text is always inside a Run.

    If you are saying that the replace is only replacing for an empty string, i would try this:

    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("text-to-replace"))
                            {
                                text.Text = text.Text.Replace("text-to-replace", "");
                run.AppendChild(new Break());
                            }
                        }
                    }
                }
            }