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

问题描述 投票:0回答:1

我一直在尝试用C#解决一个关于用一些额外的新文本信息更新段落文本的问题。

我不是一个C#开发者,如果这个问题很傻或者很容易解决,请原谅我。

我有几个这样的段落。

爱丽丝要去购物

Bob是个好人。

比方说,这几段文字是用Arial字体写的,有11个点。所以我想在每个段落后面添加一些文字。

最终的结果会是。

爱丽丝要去购物了,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);
             }
         }
     }
 }

添加文本的工作, 但风格是不一样的 和一些随机的风格,我不希望。我希望新添加的文字与段落的字体和大小一样。

我也试过几种方案,让它成为段落,只是文字等。但我找不到解决办法。

任何帮助都将是感激的。

c# openxml
1个回答
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";
}

希望能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.