【问题标题】:Replacing Content Controls in OpenXML替换 OpenXML 中的内容控件
【发布时间】:2011-03-27 18:32:03
【问题描述】:

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

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

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

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

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

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

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

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

回顾一下,我需要回答任何一个

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

-或-

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

【问题讨论】:

    标签: c# ms-word openxml openxml-sdk word-contentcontrol


    【解决方案1】:

    也许这对你有帮助,

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

    【讨论】:

    • 是的,谢谢,已经做了类似的事情,我将表格放置在块内用于迭代文本和 sdtRun 内的其他内容,并根据 Data XML 替换它们,我在内容标签中设置了路径。
    【解决方案2】:

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

    【讨论】:

    • 我会检查的。虽然我确实让它与 stdRun 和 stdBlock 一起工作,但在创建 Doc 时它并不总是如此。
    • 我们在我们的报告系统(Windward)中执行此操作,并且效果很好。仔细检查您正在创建的 docx 文件的有效性。
    【解决方案3】:

    如果您只对使用 OpenXML SDK 修改 ContentControl/SDT 时自动删除它的解决方案感兴趣,或者您是否希望它在以编程方式或通过一个用户。

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

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多