Работа с текстом

Работа с текстом

Текст в документе Word организован в узлы Run (непрерывные символы, использующие одинаковое форматирование шрифта), сгруппированные внутри узлов Paragraph. Aspose.Words FOSS для .NET предоставляет доступ к обоим напрямую, а также Font для форматирования символов, ParagraphFormat для форматирования на уровне абзаца и Range для чтения или замены текста в любой части дерева. Это руководство охватывает пробеги и шрифты, форматирование абзацев, чтение и замену текста, комментарии и форматирование списков на уровне абзаца.


Пробеги и форматирование символов

Run представляет собой участок текста, использующий один набор форматирования; его свойство Text содержит простой текстовый контент, а свойство Font (объект Font) хранит форматирование на уровне символов — Name, Size, Bold, Italic, Underline, Color, HighlightColor, Subscript/Superscript, StrikeThrough и многое другое. Font.ClearFormatting() сбрасывает шрифт пробега к значениям по умолчанию. Пробеги абзаца доступны через его свойство Runs, которое является RunCollection.


Абзацы и форматирование абзацев

Paragraph — составной узел, содержащий пробеги (и другое встроенное содержимое) одного абзаца; абзацы документа или тела доступны как ParagraphCollection (Body.Paragraphs). Paragraph.ParagraphFormat (объект ParagraphFormat) управляет макетом на уровне абзаца — Alignment, отступами (LeftIndent, RightIndent, FirstLineIndent), интервалами (SpaceBefore, SpaceAfter, LineSpacing, LineSpacingRule) и поведением пагинации (KeepTogether, KeepWithNext, PageBreakBefore, WidowControl). ParagraphFormat.ClearFormatting() сбрасывает их к значениям по умолчанию, а Paragraph.JoinRunsWithSameFormatting() объединяет соседние пробеги с одинаковым форматированием.


Чтение и замена текста с помощью Range

Каждый узел, содержащий контент — Document, Section, Paragraph или Run — предоставляет Range. Range.Text возвращает обычный текст всего, что находится в этом диапазоне, а Range.Replace(pattern, replacement) выполняет поиск и замену, ограниченную только этим диапазоном, так что вы можете, например, заменить текст внутри одного абзаца, не затрагивая остальную часть документа. Range.Delete() полностью удаляет содержимое диапазона.


Comments

Узел Comment привязывает комментарий к определённому месту в тексте; создайте его с помощью new Comment(doc, author, initial, dateTime) и задайте основной текст с помощью SetText(text), затем вставьте его в документ как любой другой узел. Comment.AddReply(author, initial, dateTime, text) добавляет вложенный ответ, а RemoveReply(reply) / RemoveAllReplies() удаляют их. Комментарии документа собираются в CommentCollection.


Форматирование списков на уровне абзаца

Paragraph.ListFormat (объект ListFormat) сообщает и управляет тем, является ли абзац частью списка: IsListItem и ListLevelNumber сообщают его текущее состояние, ApplyBulletDefault() и ApplyNumberDefault() превращают абзац в элемент списка с маркерами или нумерованный элемент по умолчанию, ListIndent() / ListOutdent() изменяют уровень вложенности списка, а RemoveNumbers() возвращает его в обычный абзац.


Советы и лучшие практики

  • Устанавливайте свойства шрифта на DocumentBuilder.Font до написания текста с помощью билдера, а не писать текст сначала и потом переоформлять отдельные объекты Run.
  • Ограничьте область действия Range.Replace самым маленьким диапазоном, охватывающим то, что действительно нужно изменить — вызывайте его для диапазона Paragraph или Section, а не для всего документа, когда изменение не должно применяться ко всему документу.
  • Вызовите Paragraph.JoinRunsWithSameFormatting() после серии программных правок, чтобы избежать излишне фрагментированной структуры пробегов.
  • Используйте ListFormat.ApplyBulletDefault() / ApplyNumberDefault() для быстрого создания списка по умолчанию, вместо того чтобы вручную конструировать определения списков, когда встроенные значения по умолчанию достаточны.
  • Читайте результаты Comment.AddReply как узлы Comment — ответы представляют собой полные объекты комментариев, а не простые строки.

Распространённые проблемы

ПроблемаПричинаИсправление
Форматирование Run’s Font не изменяет визуально соседний текстСоседний текст находится в другом Run со своей собственной FontНайдите и отформатируйте каждый затронутый Run, либо задайте форматирование через DocumentBuilder.Font перед записью
Range.Replace изменяет текст за пределами предназначенной областиReplace был вызван на Document.Range, а не на диапазоне более узкого узлаВызовите Replace на конкретном Paragraph, Section или Range другого узла
Абзац выглядит как элемент списка, но IsListItem ложноМаркер/номер — это ручной текст, а не реальное форматирование спискаПримените реальное форматирование списка с помощью ListFormat.ApplyBulletDefault() или ApplyNumberDefault() вместо вводимых символов
В документе гораздо больше узлов Run, чем ожидалосьПовторяющиеся небольшие правки разбивают участки без их объединенияВызовите Paragraph.JoinRunsWithSameFormatting() после пакетов правок

FAQ

В чём разница между Run и Paragraph?

Run — это отрезок текста, использующий один набор символьного форматирования (Font); Paragraph — составной узел, содержащий один или несколько пробегов (и другой встроенный контент) плюс форматирование уровня абзаца (ParagraphFormat).

Как прочитать весь текст в документе или разделе?

Прочитайте свойство Text этого узла Range — например, document.Range.Text или section.Range.Text.

Как найти и заменить текст только в одном абзаце?

Вызовите Replace(pattern, replacement) у Range того Paragraph, а не у Document.Range.

Как добавить комментарий к документу?

Создайте его с помощью new Comment(doc, author, initial, dateTime), задайте его текст с помощью SetText(text) и вставьте его в дерево; ответьте на него с помощью Comment.AddReply(author, initial, dateTime, text).

Как превратить абзац в пункт маркированного списка?

Вызовите ApplyBulletDefault() у ListFormat того абзаца; вместо этого используйте ApplyNumberDefault() для нумерованного списка.


API Reference Сводка

Класс/МетодОписание:
RunФрагмент текста, использующий один набор символьного форматирования.
FontФорматирование на уровне символов — имя, размер, полужирный, курсив, цвет и многое другое.
ParagraphСоставной узел, содержащий последовательности и форматирование одного абзаца.
ParagraphFormatФорматирование на уровне абзаца — выравнивание, отступы, интервал, разбиение на страницы.
ParagraphCollectionТипизированная коллекция узлов Paragraph, например Body.Paragraphs.
RangeНепрерывная область документа; поддерживает Text, Replace и Delete.
CommentВетвящийся комментарий, привязанный к месту в тексте.
CommentCollectionКоллекция комментариев документа.
ListFormatОпределяет, участвует ли абзац в списке и как именно.

См. также:

 Русский