替换OpenXML中的内容控件

15

我需要一个占位符。一开始我想使用内容控件(Content Control)来解决,但是我遇到了一些问题。

然后我研究了在.docx中添加CustomXML,但因为i4i诉讼的缘故而放弃了这个方法。

然后我决定通过OpenXML SDK 2.0直接更改内容控件的文本,但即使如此标记了内容控件,该内容控件也不会消失。我猜测它只有在Word中进行更改时才知道文本已经更改。

或许我可以移除内容控件并替换为文本,但我担心这可能会带来格式和样式方面的问题,而且这也有点违背了内容控件的目的。

然后我开始想知道是否可以定义自己的占位符,让Word能够识别。也许通过“构建块(Building Blocks)”之类的方式。这个占位符除了易于使用OpenXML查找并且可被打上标记以便我知道要替换成什么之外,不需要做任何事情。我不太确定构建块可以做什么,但我希望它是可行的。

不确定哪种方法对我最好,但我需要:

a)易于在模板中放置的东西,也许是预定义的内容控件占位符,可以放置到想要的位置并按照自己的喜好进行样式设置。

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

总之,我需要答案:

如何在OpenXML SDK中编辑内容控件(Content Controls),以便它们在添加文本后被删除。

-OR-

我能否为Word文档定义自己的OpenXML标记(tag),然后进行替换?

3个回答

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

1
是的,谢谢,我已经做了类似的事情,并且我在块内放置了表格,用于重复文本和其他在sdtRun内部,并根据我在内容标记中设置的数据XML替换它们。 - Ingó Vals

1

看一下如何使用字段。邮件合并字段正是为了这个目的而设计的。


我会去检查一下。虽然我能通过stdRun和stdBlock等方式使其正常工作,但在创建文档时,它并不总是呈现为这样的形式。 - Ingó Vals
我们在我们的报告系统(Windward)中这样做,效果很好。请仔细检查您创建的docx文件的有效性。 - David Thielen

1

从你的问题中,我不明白你是否只对自动删除ContentControl/SDT的解决方案感兴趣,当你使用OpenXML SDK进行修改时,或者你希望在内容被程序或用户修改后消失。

如果是前者,我认为你需要像Bilel建议的那样自己删除它。如果是后者,你应该查看这个属性:ContentControl.Temporary("当用户在控件中键入或控件中的文本被程序修改时,ContentControl会自动删除。当ContentControl从文档中自动删除时,控件中的文本仍然保留在文档中。")


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接