2016-10-25 60 views
2

我遵循這個結構來將字符串中的文本添加到OpenXML運行中,它們是Word文檔的一部分。如何在OpenXML中使用格式保留字符串段落,運行,文本?

該字符串具有新的行格式,甚至段落縮進,但是當文本插入到運行中時,這些全部都會被剝離。我該如何保存它?

Body body = wordprocessingDocument.MainDocumentPart.Document.Body; 

String txt = "Some formatted string! \r\nLook there should be a new line here!\r\n\r\nAndthere should be 2 new lines here!" 

// Add new text. 
Paragraph para = body.AppendChild(new Paragraph()); 
Run run = para.AppendChild(new Run()); 
run.AppendChild(new Text(txt)); 
+0

備註:帶有新線條的段落聽起來很奇怪。你確定這是你最終需要實現的嗎? –

回答

2

您需要使用Break才能添加新行,否則它們將被忽略。

我拼成一個簡單的擴展方法,該方法將在一個新行分開的字符串,並追加Text元件到RunBreak S其中新的線分別爲:

public static class OpenXmlExtension 
{ 
    public static void AddFormattedText(this Run run, string textToAdd) 
    { 
     var texts = textToAdd.Split(new[] { Environment.NewLine }, StringSplitOptions.None); 

     for (int i = 0; i < texts.Length; i++) 
     { 
      if (i > 0) 
       run.Append(new Break()); 

      Text text = new Text(); 
      text.Text = texts[i]; 
      run.Append(text); 
     } 
    } 
} 

這可以用於像此:

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(@"c:\somepath\test.docx", true)) 
{ 
    var body = wordDoc.MainDocumentPart.Document.Body; 

    String txt = "Some formatted string! \r\nLook there should be a new line here!\r\n\r\nAndthere should be 2 new lines here!"; 

    // Add new text. 
    Paragraph para = body.AppendChild(new Paragraph()); 
    Run run = para.AppendChild(new Run()); 

    run.AddFormattedText(txt); 
} 

哪產生以下輸出:

enter image description here

+0

太棒了!非常感謝。我覺得奇怪的是,這並不是某種內在的認識。我可能會建立你的擴展方法,並解釋標籤! – Michael

+0

很高興我可以幫助@邁克爾 - 祝你好運:) – petelids

+0

任何機會,你知道爲什麼格式化必須手動處理這種方式嗎?我仍然不明白爲什麼它(openXML)忽略.net換行符/製表符?例如,假設我從webbrowser複製了任何格式化的文本,然後將其粘貼到word文檔中。它會自動識別某些格式並相應地應用它。 – Michael

相關問題