我需要一些占位符。起初,我将内容控制作为解决方案,但是我遇到了一些问题。
然后,我考虑将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/