如何用纯文本内容控件替换富文本内容控件

Posted

技术标签:

【中文标题】如何用纯文本内容控件替换富文本内容控件【英文标题】:How to replace RichText Content Control by PlainText Content Control 【发布时间】:2014-02-10 11:00:24 【问题描述】:

我们刚刚发现富文本内容控件不允许换行。

我们有数千个用作模板的 word 文档。 我需要一种以编程方式将每个富文本内容控件替换为纯文本控件并允许换行符的方法。

XML 中似乎没有属性可以表示来自纯文本的富文本内容控件。

我可以简单地补充一下吗:

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

对于每个内容控件,还是应该删除旧的并创建一个新的?

更新 1:根据this post:

w:stdPr 元素有一个子元素,指示内容控件的类型。 内容控件的默认类型是富文本,因此如果这是内容控件的类型,您将看不到此子元素。

如果内容控件类型是纯文本,会有一个child 元素。

【问题讨论】:

富文本控件通常不允许的是内容控件数据绑定。换行符很好,表格(如果它是块级控件)、嵌套内容控件等也很好。 【参考方案1】:

添加一个 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();
    

【讨论】:

以上是关于如何用纯文本内容控件替换富文本内容控件的主要内容,如果未能解决你的问题,请参考以下文章

C#中,怎么使用富文本框控件显示一个文件的内容

富文本内容简单的的增删改查

如何用VBA实现WORD批量替换?

WPF界面布局——各种控件

iOS--富文本

如何用C#编写文本编辑器