Работа с текстом
Работа с текстом
Текст в документе 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 | Определяет, участвует ли абзац в списке и как именно. |