【发布时间】:2013-06-24 12:21:38
【问题描述】:
我正在尝试替换作为模板的 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。如您所见,在@ 和date 或@ 和Surname 等情况下,我无法正确使用我的替换方法,因为没有@date 或@Surname 积极到位。所以我改进了我的代码,但现在我发现其中有很多缺陷,所以它将遗漏的@'s 连接到下一个文本。不幸的是,我在一个表格中找到了一个文本,它完全杀死了我所有的算法。
是这样的:
(@
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>
【问题讨论】:
标签: c# xml formatting wordprocessingml word-processor