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

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

然后,我决定只通过OpenXML SDK 2.0来简单地更改内容控件的文本,但是即使如此标记,内容控件也不会消失。我猜除非文本在单词内部发生,否则它不知道文本已更改。

我也许可以只删除CC并放置文本,但是我担心它可能带来的格式和样式问题,而且还违反了内容控件的目的。

然后,我开始怀疑是否可以定义Word可以识别的自己的占位符。通过构建基块。除了使用OpenXML很容易找到并且可以以某种方式标记之外,它不需要执行任何操作,因此我知道用它替换什么。我不太确定可以使用Building Blocks做什么,但我希望它是可行的。

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

a)易于放置在模板中的东西,也许是预定义的Content Control占位符,您可以将它们放置在不需要的位置并根据需要设置样式。

b)添加数据后,它将删除所有占位符,不会再次对其进行修改。它将样式/格式保留在占位符中。

要回顾一下,我需要回答其中一个

如何在OpenXML SDK中编辑内容控件,以便在添加文本后将其删除。

-或者-

是否可以为可以替换的Word文档定义自己的自定义OpenXML标记?

最佳答案

也许这可以帮助您,

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();
    }

关于c# - 替换OpenXML中的内容控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3448297/

10-08 21:33