我目前面临的问题是,占位符通常在
<w:t>
元(
DocumentFormat.OpenXml.Wordprocessing.Text
)内的多个
<w:p>
元(
DocumentFormat.OpenXml.Wordprocessing.Paragraph
)之间进行分配。一个例子<w:p w:rsidR="003137E0" w:rsidRDefault="008C62F1" w:rsidP="00D43D55">
<w:r>
<w:t xml:space="preserve">#FirstName# </w:t>
</w:r>
<w:r w:rsidR="00C93A70">
<w:t>#LastName</w:t>
</w:r>
<w:r w:rsidR="005F49B7">
<w:t>#</w:t>
</w:r>
</w:p>
在这里占位符
#FirstName#
很容易识别,因为它在一个e元素之内,但是占位符<w:t>
在多个元素之间分开,这样我就不能在文本上使用简单的正格书文档喜欢
#LastName#
我无法控制模板如何定义,我也不会对用户对他们如何创建模板的限制进行限制。对我来说,当占位符被分为多个
<w:t>
元时,尚不清楚。
另一个示例使用Regex placeholderRegex = new Regex(@"#[\w]*#");
document.MainDocumentPart.Document.Body.Descendants<Text>().Where(t=> placeholderRegex.IsMatch(t.Text))
作为占位符的架构。
文本(DOCX)<w:t>
XML(OpenXML)
{{[\w]*}}
所以我的问题现在是使用开放XML SDK用值搜索和替换占位符的方法? SDK中是否有一些可以帮助我的功能?还有其他人解决了这个问题并提供帮助吗?
请参见
docx4j不代替变量用于解决问题的Java源代码的链接。 您可以在C#中实现类似的内容,也可以通过Http://www.nuget.org/packages/docx4j.net/3.0.1
使用该代码。
我会用这样的事情来做到这一点(未经测试,但我认为这会有所帮助):{{Ort}}
And this {{placeholder}} is within the text
为所有单词创建映射,其中包含每个单词组成的相应运行/文本元素的信息。 然后,您将搜索索引以获取特定单词(例如
)并替换第一个运行/文本元素的内容,然后删除所有其他内容,除了最后一个,这可能是下一个单词的一部分。在这种情况下,您将必须修复它,以便仅此单词的一部分不再包含该单词的一部分。