C# 替换OpenXML中内容控件的文本

C# 替换OpenXML中内容控件的文本,c#,ms-word,openxml,word-contentcontrol,C#,Ms Word,Openxml,Word Contentcontrol,我有一个word文件,它有多个富文本内容控件我想更改它的文本。我使用这个代码 using (WordprocessingDocument theDoc = WordprocessingDocument.Open(docName, true)) { MainDocumentPart mainPart = theDoc.MainDocumentPart; foreach (SdtElement sdt in mainPart.Document.Descendants<Sdt

我有一个word文件,它有多个
富文本内容控件
我想更改它的文本。我使用这个代码

 using (WordprocessingDocument theDoc = WordprocessingDocument.Open(docName, true))
 {
    MainDocumentPart mainPart = theDoc.MainDocumentPart;
    foreach (SdtElement sdt in mainPart.Document.Descendants<SdtElement>())
    {
        SdtAlias alias = sdt.Descendants<SdtAlias>().FirstOrDefault();
        if (alias != null)
        {
            string sdtTitle = alias.Val.Value;
            var t = sdt.Descendants<Text>().FirstOrDefault();
            t.Text="Atul works at Microsoft as a .NET consultant. As a consultant his job is to design, develop and deploy";
        }
    }
 }
使用(WordprocessingDocument theDoc=WordprocessingDocument.Open(docName,true))
{
main documentpart main part=doc.main documentpart;
foreach(mainPart.Document.subjects()中的sdt元素sdt)
{
SdtAlias别名=sdt.subjects().FirstOrDefault();
如果(别名!=null)
{
字符串sdtTitle=alias.Val.Value;
var t=sdt.subjects().FirstOrDefault();
t、 Text=“Atul在Microsoft担任.NET顾问。作为顾问,他的工作是设计、开发和部署”;
}
}
}

它是用旧文本添加新文本。但是我想替换这个

您只能检索和更新SDT内容的第一个文本。 要替换所有这些,最简单的方法是:

  • 删除所有文本
  • 添加新文本
使用以下内容更新您的代码:

if (alias != null)
{
    // delete all paragraph of the sdt
    sdt.Descendants<Paragraph>().ToList().ForEach(p => p.Remove());
    // insert your new text, who is composed of:
    // - A Paragraph
    // - A Run
    // - A Text
    sdt.Append(new Paragraph(new Run(new Text("As a consultant his job is to design, develop and love poney."))));
}
if(别名!=null)
{
//删除sdt的所有段落
sounders().ToList().ForEach(p=>p.Remove());
//插入您的新文本,其中包括:
//-一段
//-跑步
//-文本
附加(新段落(新运行(新文本(“作为顾问,他的工作是设计、开发和热爱poney”)));
}
编辑:我忘了添加段落和段落


您可以在这里看到如何构建sdt内容

您想用什么替换它。,?sdt的文本具有70个字符的文本,当我设置文本时,它将文本替换为20个字符的文本。但我想删除所有70个字符,然后替换文本。谢谢,但我有一个模板文件,每个ContentControl都有一个格式,我不会删除它。我想替换文本。在替换文本之前和替换itI之后,请给出您的xml。我不理解您的解决方案。在openxml中,您的文本可以拆分为不同的
。原则是抑制所有文本并添加新文本。这是一个替代品。但是,如果您共享您的xml(因为在这里,我提出了一个盲目的解决方案,我不能保证它在没有更改的情况下也能像这样工作),那就简单多了。谢谢,我使用这个<代码>文本新文本=新文本(“值”);运行newRun=新运行();追加(newText);附加(newRun)但当打开word时,我得到一个无法打开的错误。