替换OpenXML中的内容控件

Ing*_*als 13 c# ms-word openxml openxml-sdk word-contentcontrol

我需要一些东西作为占位符.我起初将内容控制视为一种解决方案,但我遇到了一些问题.

然后我考虑将.docx中的CustomXML添加到其中,但由于i4i的诉讼而拒绝了.

然后我决定通过OpenXML SDK 2.0简单地改变内容控制的文本,但即使它如此标记,内容控制也不会消失.我想它不知道文本发生了变化,除非它发生在单词内部.

我或许可以删除CC并放置文本,但我担心它可能带来的格式和样式问题,而且它会违反内容控制的目的.

然后我开始想知道我是否可以定义Word可以识别的自己的占位符.也许通过积木.它不需要做任何事情,除了易于使用OpenXML找到并以某种方式可标记,所以我知道用什么来替换它.我不确定可以用Building Blocks做什么,但我希望它能够做到.

不确定哪种解决方案最适合我,但我需要的是:

a)一些容易放在模板中的东西,也许是预定义的内容控件占位符,你可以放置在你想要的地方并按照你喜欢的样式.

b)添加数据后,删除所有占位符,不再修改.它保持在占位符中定义的样式/格式.

要收回,我需要回答

如何在OpenXML SDK中编辑内容控件,以便在添加文本后删除它们.

-要么-

我可以为Word文档定义自己的自定义OpenXML标记,然后我可以替换它吗?

Dev*_*Tun 7

也许这可以帮到你,

private void DeleteSdtBlockAndKeepContent(MainDocumentPart mainDocumentPart, string sdtBlockTag)
    {
        List<SdtBlock> sdtList = mainDocumentPart.Document.Descendants<SdtBlock>().ToList();
        SdtBlock sdtA = null;

        foreach (SdtBlock sdt in sdtList)
        {
            if (sdt.SdtProperties.GetFirstChild<Tag>().Val.Value == sdtBlockTag)
            {
                sdtA = sdt;
                break;
            }
        }


        OpenXmlElement sdtc = sdtA.GetFirstChild<SdtContentBlock>();
        OpenXmlElement parent = sdtA.Parent;

        OpenXmlElementList elements = sdtc.ChildElements;

        var mySdtc = new SdtContentBlock(sdtc.OuterXml);

        foreach (OpenXmlElement elem in elements)
        {

            string text = parent.FirstChild.InnerText;
            parent.Append((OpenXmlElement)elem.Clone());
        }

        sdtA.Remove();
    }
Run Code Online (Sandbox Code Playgroud)