Inserting newlines in Word using OpenXML

50,262

Solution 1

To insert newlines, you have to add a Break instance to the Run.

Example:

run.AppendChild(new Text("Hello"));
run.AppendChild(new Break());
run.AppendChild(new Text("world"));

The XML produced will be something like:

<w:r>
  <w:t>Hello</w:t>
  <w:br/>
  <w:t>world</w:t>
</w:r>

Solution 2

Here's a C# function that will take a string, split it on line breaks and render it in OpenXML. To use, instantiate a Run and pass it into the function with a string.

void parseTextForOpenXML( Run run, string textualData )
{
    string[ ] newLineArray = { Environment.NewLine };
    string[ ] textArray = textualData.Split( newLineArray, StringSplitOptions.None );

    bool first = true;

    foreach ( string line in textArray )
    {
        if ( ! first )
        {
            run.Append( new Break( ) );
        }

        first = false;

        Text txt = new Text( );
        txt.Text = line;
        run.Append( txt );
    }

Solution 3

Altough this question is already answered I have another approach to solve questions like :

How can I make XXX with OpenXML??

In this cases you could make use of the powerful Microsoft OpenXML productivity tool (also known as OpenXmlSdkTool). Download here.

  1. Create a new office document
  2. Add the parts to the document which you would like to reproduce with OpenXML SDK.
  3. Open the office document with Microsoft OpenXML productivity tool
  4. Click on "Reflect Code"
  5. On the right side you will see now you document reflected into C# code.

Solution 4

I have the same issue and in my case <w:br /> tag worked.

Share:
50,262
Danny
Author by

Danny

Updated on July 08, 2022

Comments

  • Danny
    Danny almost 2 years

    I am using openxml WordProcessingDocument to open a Word template and replace placeholder x1 with a string. This works fine unless I need the string to contain a newline. How can I replace x1 with text may contain newlines that word would recognise? I have tried \n \r but these do not work

    Just to explain further when the word template is opened I read it into a StreamReader then use .Replace to replace x1.

  • Danny
    Danny almost 14 years
    I don't think I can use your answer in my situation. I updated my question to explain further
  • codeape
    codeape almost 14 years
    So you're working with the XML directly? In that case, try inserting XML like the example.
  • habiat
    habiat over 9 years
    niceeeee solution,thank's a lot, i use this solution when my string contains \n\r
  • outofmind
    outofmind over 8 years
    Note, that in PPTX / PresentationML the Break() has to be child of the Paragraph, not child of the Run
  • BertuPG
    BertuPG over 8 years
    Worked like a charm! Tank you very much!
  • dougajmcdonald
    dougajmcdonald over 8 years
    This is a great answer! I was after working out some tricky open xml bits and had to google the inner workings of almost every element. Having a tool which can output the trick bits and paste them in is a major timesaver, thanks.
  • its4zahoor
    its4zahoor about 5 years
    Thanks, I modified string[ ] newlineArray = { Environment.NewLine, "\n", "\r\n", "\n\r" } to make it work for all type of break. 8 years past but still it's the best answer.