簡體   English   中英

替換OpenXML中的內容控件

[英]Replacing Content Controls in OpenXML

我需要一些東西作為占位符。 我起初將內容控制視為一種解決方案,但我遇到了一些問題。

然后我考慮將.docx中的CustomXML添加到其中,但由於i4i的訴訟而拒絕了。

然后我決定通過OpenXML SDK 2.0簡單地改變內容控制的文本,但即使它如此標記,內容控制也不會消失。 我想它不知道文本發生了變化,除非它發生在單詞內部。

我或許可以刪除CC並放置文本,但我擔心它可能帶來的格式和樣式問題,而且它會違反內容控制的目的。

然后我開始想知道我是否可以定義Word可以識別的自己的占位符。 也許通過積木。 它不需要做任何事情,除了易於使用OpenXML找到並以某種方式可標記,所以我知道用什么來替換它。 我不確定可以用Building Blocks做什么,但我希望它能夠做到。

不確定哪種解決方案最適合我,但我需要的是:

a)一些容易放在模板中的東西,也許是預定義的內容控件占位符,你可以放置在你想要的地方並隨意設計。

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

看一下使用Field。 郵件合並字段專為此目的而設計。

我不理解您的問題,如果您只對使用OpenXML SDK修改ContentControl / SDT時自動刪除ContentControl / SDT的解決方案感興趣,或者您希望它在以編程方式或用戶修改內容后消失。

如果是前者,我認為你必須自己將其刪除, 就像Bilel建議的那樣 如果是后者,你應該看一下這個屬性: ContentControl.Temporary (“當用戶鍵入控件時,或者當控件中的文本以編程方式更改時,ContentControl會自動刪除。當ContentControl自動從文檔中刪除時,控件中的文本仍保留在文檔中。“)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM