13

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

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

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

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

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

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

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

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

回顾一下,我需要回答

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

-或者-

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

4

3 回答 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();
    }
于 2010-08-19T08:39:56.037 回答
1

看看使用字段。邮件合并字段正是为此目的而设计的。

于 2011-06-10T01:41:11.103 回答
1

如果您只对使用 OpenXML SDK 修改 ContentControl/SDT 时自动删除它的解决方案感兴趣,或者您是否希望它在以编程方式或由用户修改内容后消失,我不明白您的问题。

如果是前者,我认为您必须按照 Bilel 的建议自行删除它。如果是后者,你应该看看这个属性:ContentControl.Temporary ("当用户在控件中键入内容时,或者当控件中的文本以编程方式更改时,会自动删除 ContentControl。当从文档中自动删除 ContentControl 时,控件中的文本保留在文档中。”)

于 2011-12-30T00:44:40.377 回答