Как добавить текст в существующий абзац, не нарушая стиль в C#? - PullRequest
0 голосов
/ 29 апреля 2020

Я пытался решить одну проблему в C#, касающуюся обновления текста абзаца некоторой дополнительной новой текстовой информацией:

Я не C# разработчик, простите, если вопрос глупый или простой чтобы решить.

У меня есть несколько таких параграфов:

Алиса собирается сделать покупки.

Боб хороший парень.

Допустим, эти абзацы написаны шрифтом 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. Но я не мог найти решение.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 29 апреля 2020

В открытом формате 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 под абзацем.

Таким образом, вместо этого вы можете найти последний элемент Run, содержащий элемент Text, и изменить его текст.

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";
}

Надеюсь, это поможет.

...