2014-02-10 221 views
0

我們剛剛發現Rich Text Content Controls不允許換行符。如何用PlainText內容控件替換RichText內容控件

我們有幾千個用作模板的word文檔。 我需要一種方法來以編程方式替換純文本格式的每個Rich Text內容控件並允許換行。

在XML中,似乎沒有任何屬性表示來自純文本格式的富文本內容控件。

我能簡單地添加:

<w:text w:multiLine="1"/> 

每個內容的控制,或者我應該刪除舊的,創造一個新的?

UPDATE 1:根據this post

還有就是瓦特的子元素:指示內容的控制的類型stdPr元件。 內容控件的默認類型是Rich Text,所以如果這是內容控件的類型,您將看不到此子元素。

如果內容控件類型爲純文本,則會出現子元素 。

+0

什麼富文本控件通常不允許爲內容的控制數據綁定。換行符很好,表格也是如此(提供了塊級控件),嵌套內容控件等。 – JasonPlutext

回答

0

添加類型的新子元素SdtContentText確實是解決方案。我正在使用OpenXML Power Tools

下面的代碼是從here採取:

public static class ContentControlExtensions 
{ 
    public static IEnumerable<OpenXmlElement> ContentControls(
     this OpenXmlPart part) 
    { 
     return part.RootElement 
      .Descendants() 
      .Where(e => e is SdtBlock || e is SdtRun); 
    } 

    public static IEnumerable<OpenXmlElement> ContentControls(
     this WordprocessingDocument doc) 
    { 
     foreach (var cc in doc.MainDocumentPart.ContentControls()) 
      yield return cc; 
    } 
} 

然後:

using (WordprocessingDocument doc = 
       WordprocessingDocument.Open(sourceFile, true)) 
    { 
     foreach (var cc in doc.ContentControls()) 
     { 
      SdtProperties props = cc.Elements<SdtProperties>().FirstOrDefault(); 
      Tag tag = props.Elements<Tag>().FirstOrDefault(); 
      SdtContentText text = props.Elements<SdtContentText>().FirstOrDefault(); 
      if (text == null) 
      { 
       text = new SdtContentText(); 
       text.MultiLine = new OnOffValue(true); 
       cc.AppendChild<SdtContentText>(text); 
      } 
      if (tag != null) 
       Console.WriteLine(tag.Val); 
     } 

     doc.MainDocumentPart.Document.Save(); 
    }