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

时间:2014-02-10 11:00:24

标签: c# openxml contentcontrol

我们刚刚发现Rich Text Content Controls不允许换行。

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

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

我可以简单地添加:

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

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

更新1 :根据this post

  

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

     

如果内容控件类型是纯文本,则会有一个孩子    元件。

1 个答案:

答案 0 :(得分: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();
    }
相关问题