2014-02-10 288 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(); 
    }