我们刚刚发现Rich Text Content Controls不允许换行。
我们有数千个word文档用作模板。 我需要一种方法来以编程方式替换纯文本内容的每个Rich Text内容控件,并允许换行符。
XML中似乎没有属性表示纯文本内容控件来自纯文本内容控件。
我可以简单地添加:
<w:text w:multiLine="1"/>
对于每个内容控件,还是应该删除旧内容控件并创建一个新内容?
更新1 :根据this post:
w:stdPr元素有一个子元素,表示内容控件的类型。 内容控件的默认类型是Rich Text,因此如果这是内容控件的类型,您将看不到此子元素。
如果内容控件类型是纯文本,则会有一个孩子 元件。
答案 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();
}