我一直在尝试解决C#中的一个问题,即用一些其他新文本信息更新段落文本:
我不是C#开发人员,如果问题很愚蠢或易于解决,请原谅我。
我有几个这样的段落:
爱丽丝要去购物。
鲍勃是个好人。
比方说,这些段落以11磅的Arial字体编写。所以我想在每个段落之后添加一些文本。
最终结果将是:
爱丽丝要去购物。SomeText0
鲍勃是个好人。SomeText1
我已经尝试过了:
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
List<Paragraph> paragraphs = paragraphService.GetParagraphs(wordDoc);
foreach (Paragraph par in paragraphs)
{
string paragraphText = paragraphService.ParagraphToText(par);
paragraphText = textService.DeleteDoubleSpace(paragraphText);
if (paragraphText.Length != 0)
{
if (paragraphText == targetParagraph)
{
//Here I know that the added text will be corresponding to the my target paragraph.
//This paragraph comes from a JSON file but for simplicity I did not add that part.
par.Append(new Run(new Text("SomeText0")));
par.ParagraphProperties.CloneNode(true);
}
}
}
}
添加文本是可行的,但是样式不一样,有些我不想要的随机样式。我希望新添加的文本具有与段落相同的字体和大小。
我也尝试了几种选择,使其成为段落,仅文本等。但是我找不到解决方案。
任何帮助将不胜感激。
答案 0 :(得分:1)
开放的xml格式存储如下所示的段落
<w:p>
<w:r>
<w:t>String from WriteToWordDoc method.</w:t>
</w:r>
</w:p>
在这里
Paragraph
类表示的元素,Run
类表示的元素,并且Text
类表示的元素。因此,您要追加一个新的<w:r> => Run
元素,该元素具有自己的格式设置,并且由于您未指定任何格式,因此将使用默认设置。
编辑1:看起来,当本段中的某些部分的格式不同时,一个段落下可以有多个Run元素。
因此,您可以找到包含Text元素的最后一个Run元素并修改其文本。
foreach (Paragraph par in paragraphs)
{
Run[] runs = par.OfType<Run>().ToArray();
if (runs.Length == 0) continue;
Run[] runsWithText = runs.Where(x => x.OfType<Text>().ToArray().Length > 0).ToArray();
if (runsWithText.Length == 0) continue;
Text lastText = runsWithText.Last().OfType<Text>().Last();
lastText.Text += " Some Text 0";
}
希望这会有所帮助。