我正在尝试替换作为模板的 word 文档中的某些位置。这些地方被标记为以 开头的单词@
。例如@Name
. 我选择所有文本,用我的函数遍历它们并替换。这背后的所有逻辑都运行良好。但是,由于我不知道的原因,文本的定义如下:
List<Text> texts = w.MainDocumentPart.Document.Descendants<Text>().ToList();
不是我期望的那样。例如(文本的简短列表,其中每行有一个文本):
Document date:
@
date
, written by:
@Name
@
Surname
即使它应该像这样在一行中:Document date: @date, written by: @Name @Surname
. 如您所见,在@
and date
OR @
and之类的情况下Surname
,我无法正确使用我的替换方法,因为没有@date
也没有@Surname
主动到位。所以我改进了我的代码,但现在我发现其中有很多缺陷,所以它将 left-out 连接@
到下一个文本。不幸的是,我在一个表格中找到了一个文本,它完全杀死了我所有的算法。是这样的:
(@
sum_
words)
即使我没有专门用不同的样式格式化它。如您所见,它必须是(@sum_words)
,在这种情况下,我的算法很容易被替换。不幸的是,我做不到。因此,我的问题是:
- 为什么即使我没有使单词的各个部分有所不同,它也会分成几部分?
- 有没有办法解决这个问题,所以我的文字可以完好无损?
更新
到目前为止,我能做的最好的事情是:
for (int i = texts.Count - 1; i > 0; i--)
{
if (texts[i - 1].Text.EndsWith("@") || texts[i - 1].Text.EndsWith("_"))
{
texts[i - 1].Text = texts[i - 1].Text + texts[i].Text;
texts[i].Text = "";
}
}
如果它们中途拆分,则连接文本(从我所见,它们只会在特定于我需要的字符上拆分,即@
和_
。循环被反转,因为保存第一个文本的属性更有意义组中的一部分而不是最后一个(例如在元素之前保留间距)。
更新 2
这是请求的表格单元格:
<w:tc>
<w:tcPr>
<w:tcW w:w="2410" w:type="dxa"/>
<w:tcBorders>
<w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:left w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
</w:tcBorders>
<w:shd w:val="clear" w:color="auto" w:fill="auto"/>
</w:tcPr>
<w:p w:rsidR="009D473B" w:rsidRDefault="00385754" w:rsidP="00385754">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:lang w:val="lt-LT"/>
</w:rPr>
</w:pPr>
<w:r>
<w:rPr>
<w:lang w:val="lt-LT"/>
</w:rPr>
<w:t>@sum</w:t>
</w:r>
<w:r w:rsidR="009D473B">
<w:rPr>
<w:lang w:val="lt-LT"/>
</w:rPr>
<w:t xml:space="preserve">(@</w:t>
</w:r>
<w:r>
<w:rPr>
<w:lang w:val="lt-LT"/>
</w:rPr>
<w:t>sum_</w:t>
</w:r>
<w:r w:rsidR="009D473B">
<w:rPr>
<w:lang w:val="lt-LT"/>
</w:rPr>
<w:t>words)</w:t>
</w:r>
</w:p>
</w:tc>