Как работать с текстом в .NET
Это руководство показывает, как работать с текстом в Aspose.Words FOSS для .NET: форматирование шрифта пробега, форматирование абзаца, поиск и замена текста с помощью Range, добавление комментария и преобразование абзаца в элемент списка. Aspose.Words FOSS для .NET доступен через NuGet или сборкой из исходного кода.
Пошаговое руководство
Шаг 1: Получить библиотеку
Клонируйте репозиторий и соберите Aspose.Words.sln в конфигурации Release, затем добавьте ссылку на проект Aspose.Words.csproj из вашего собственного проекта .NET, как описано в Руководстве по установке. Добавьте using Aspose.Words; в начале любого файла, работающего с текстом.
Шаг 2: Форматировать шрифт пробега
Run — это фрагмент текста, использующий один набор форматирования; его свойство Text содержит чистый текст, а свойство Font (объект Font) хранит форматирование на уровне символов — Name, Size, Bold, Italic, Underline, Color, HighlightColor, Subscript/Superscript и StrikeThrough и др. Font.ClearFormatting() сбрасывает пробег к значениям по умолчанию. Пробеги абзаца доступны через его свойство Runs, которое является RunCollection. Установка свойств шрифта на DocumentBuilder.Font перед записью нового текста обычно проще, чем последующее форматирование отдельных объектов Run.
Шаг 3: Форматировать абзац
Paragraph.ParagraphFormat (объект ParagraphFormat) управляет разметкой на уровне абзаца: Alignment, отступами (LeftIndent, RightIndent, FirstLineIndent), интервалами (SpaceBefore, SpaceAfter, LineSpacing, LineSpacingRule) и поведением разбиения на страницы (KeepTogether, KeepWithNext, PageBreakBefore, WidowControl). ParagraphFormat.ClearFormatting() сбрасывает их к значениям по умолчанию, а Paragraph.JoinRunsWithSameFormatting() объединяет соседние фрагменты с одинаковым форматированием — полезно после серии программных правок, когда абзац содержит больше фрагментов, чем необходимо.
Шаг 4: Поиск и замена текста в диапазоне
Каждый узел, содержащий контент — Document, Section, Paragraph или Run — предоставляет Range. Range.Text возвращает обычный текст всего, что находится в этом диапазоне, а Range.Replace(pattern, replacement) выполняет поиск и замену, ограниченную только этим диапазоном: вызовите его на Paragraph’s Range, чтобы изменить текст только в одном абзаце, или на Document.Range, чтобы искать по всему документу. Range.Delete() полностью удаляет содержимое диапазона.
Шаг 5: Добавить комментарий
Создайте Comment с помощью new Comment(doc, author, initial, dateTime), задайте его текст с помощью SetText(text), затем вставьте его в дерево как любой другой узел. Comment.AddReply(author, initial, dateTime, text) прикрепляет ответ в виде ветки — сам по себе Comment — и RemoveReply(reply) / RemoveAllReplies() снимают ответы обратно. Комментарии документа собираются в CommentCollection.
Шаг 6: Превратить абзац в элемент списка
Paragraph.ListFormat (объект ListFormat) сообщает и управляет тем, участвует ли абзац в списке: IsListItem и ListLevelNumber отображают его текущее состояние. ApplyBulletDefault() преобразует абзац в элемент с маркером по умолчанию, а ApplyNumberDefault() — в нумерованный элемент по умолчанию; ListIndent() / ListOutdent() изменяют уровень вложенности, а RemoveNumbers() возвращает его в обычный абзац.
Общие проблемы и решения
Форматирование одного Runего шрифт не меняет соседний текст. Соседний текст отличается Run со своим собственным Font экземпляр. Либо найдите и отформатируйте каждый затронутый Run, либо задайте форматирование для DocumentBuilder.Font перед записью нового текста.
Range.Replace изменяет текст за пределами предполагаемой области. Replace был вызван на Document.Range вместо диапазона более узкого узла. Вызовите его на конкретном Paragraph or Section чей текст должен измениться.
Параграф выглядит как элемент маркированного списка, но IsListItem is false. Маркер — это набранный текст, а не реальное форматирование списка. Примените его с ListFormat.ApplyBulletDefault() вместо.
В документе оказывается гораздо больше Run узлов, чем ожидалось. Повторяющиеся небольшие программные правки разрывают участки без их объединения. Вызовите Paragraph.JoinRunsWithSameFormatting() после группы правок.
Часто задаваемые вопросы
В чём разница между Run и Paragraph?
Объект Run — это отрезок текста, использующий один набор символьного форматирования (Font). Объект Paragraph — составной узел, содержащий один или несколько ранов плюс форматирование на уровне абзаца (ParagraphFormat).
Как прочитать весь текст в документе или в отдельном разделе?
Прочитайте свойство Text у Range этого узла — document.Range.Text или section.Range.Text.
Как заменить текст только в одном абзаце, а не во всём документе?
Вызовите Replace(pattern, replacement) у Range того Paragraph, а не у Document.Range.
Как ответить на существующий комментарий?
Вызовите Comment.AddReply(author, initial, dateTime, text) у оригинального экземпляра Comment.
Как превратить элемент нумерованного списка обратно в обычный абзац?
Вызовите RemoveNumbers() на ListFormat этого абзаца.