如何在不破坏C#样式的情况下向现有段落添加文本?

时间:2020-04-29 16:56:39

标签: c# openxml

我一直在尝试解决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);
             }
         }
     }
 }

添加文本是可行的,但是样式不一样,有些我不想要的随机样式。我希望新添加的文本具有与段落相同的字体和大小。

我也尝试了几种选择,使其成为段落,仅文本等。但是我找不到解决方案。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

开放的xml格式存储如下所示的段落

<w:p>
  <w:r>
    <w:t>String from WriteToWordDoc method.</w:t>
  </w:r>
</w:p>

在这里

  1. p是Paragraph类表示的元素,
  2. r是Run类表示的元素,并且
  3. t是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";
}

希望这会有所帮助。