Работа со стилями
Работа со стилями
Это руководство показывает, как работать со стилями абзацев, символов, таблиц и списков в Aspose.Words FOSS для .NET — поиск и применение встроенных и пользовательских стилей, а также настройка условного форматирования по регионам для стилей таблиц.
Объект Style представляет один встроенный или пользовательский стиль — именованную коллекцию форматирования абзаца, шрифта и списка, которую Word применяет, когда абзац или диапазон текста получает этот стиль. Каждый документ предоставляет свои стили через свойство Document.Styles, которое возвращает StyleCollection. Стили таблиц представлены TableStyle, подклассом Style, который добавляет специфическое для таблиц форматирование и условное форматирование по регионам через ConditionalStyleCollection.
Типы стилей и их идентификация
У каждого Style есть свойство Type типа StyleType, которое может принимать одно из значений Paragraph, Character, Table или List — соответствуя четырём типам стилей, поддерживаемых Word. Встроенные стили также несут независимое от локали перечисляемое значение StyleIdentifier (например, значения, соответствующие заголовкам, выделению и гиперссылкам), чтобы код мог искать встроенный стиль без зависимости от его отображаемого имени в конкретном языке. Читаемое человеком имя стиля доступно через Style.Name, а Style.Aliases возвращает любые альтернативные имена, которые Word признает для того же стиля. Style.BuiltIn сообщает, поставляется ли стиль вместе с Word или определён в документе, а Style.IsHeading сообщает, является ли стиль одним из встроенных стилей заголовков.
Доступ к коллекции стилей и её управление
StyleCollection — это коллекция всех объектов Style — встроенных и пользовательских — привязанных к документу, доступная через Document.Styles. Получить стиль по его отображаемому имени можно с помощью индексатора StyleCollection — styles[name] — или получить встроенный стиль по его независимому от локали StyleIdentifier, используя тот же индексатор — styles[sti] — что надёжнее, чем поиск по имени в документах, созданных на разных языках. Новые стили создаются с помощью StyleCollection.Add(type, name), указывая StyleType и имя, а существующий стиль можно дублировать в коллекцию с помощью StyleCollection.AddCopy(style). StyleCollection.Count сообщает, сколько стилей содержит документ, и коллекция также предоставляет DefaultFont и DefaultParagraphFormat, описывающие форматирование по умолчанию для всего документа, которое наследуется новым содержимым до применения какого-либо явного стиля. StyleCollection.ClearQuickStyleGallery() удаляет все стили из галереи быстрых стилей интерфейса Word, не удаляя сами стили.
Применение стилей к абзацам и фрагментам
Объекты форматирования, которые могут содержать стиль, предоставляют как свойство Style (сам объект Style), так и свойство StyleName (ярлык, который разрешает или создаёт стиль по имени). ParagraphFormat.Style и ParagraphFormat.StyleName применяют стиль абзаца, тогда как Font.Style и Font.StyleName применяют стиль символов к форматированию фрагмента. Свои свойства LinkedStyleName, BaseStyleName и NextParagraphStyleName стиля описывают его отношение к другим стилям: BaseStyleName указывает имя стиля, от которого он наследует неустановленное форматирование, LinkedStyleName указывает парный стиль абзаца/символов (как Word делает для встроенных стилей, таких как Heading 1 и его связанный стиль символов), а NextParagraphStyleName указывает стиль, который Word назначает новому абзацу, набранному после абзаца, использующего этот стиль.
Стили таблиц и условное форматирование
TableStyle расширяет Style, добавляя свойства таблицы-разметки, такие как Alignment, CellSpacing, LeftIndent, Shading, VerticalAlignment и отступы (LeftPadding, RightPadding, TopPadding, BottomPadding), а также RowStripe и ColumnStripe, которые управляют тем, через сколько строк или столбцов повторяется шаблон чередования. Помимо единообразного форматирования таблицы, TableStyle.ConditionalStyles возвращает ConditionalStyleCollection, содержащий по одному ConditionalStyle для каждой области таблицы — FirstRow, LastRow, FirstColumn, LastColumn, OddRowBanding, EvenRowBanding, OddColumnBanding, EvenColumnBanding и четырёх угловых ячеек (TopLeftCell, TopRightCell, BottomLeftCell, BottomRightCell). Каждый ConditionalStyle имеет свои Font, ParagraphFormat, Shading, Borders и отступ ячейки, а его свойство Type сообщает, какую ConditionalStyleType область он представляет. ConditionalStyle.ClearFormatting() и ConditionalStyleCollection.ClearFormatting() сбрасывают форматирование для одной области или для всего набора условных областей.
Метаданные стиля и флаги поведения
Несколько логических и числовых свойств в Style управляют тем, как Word обрабатывает стиль в пользовательском интерфейсе, а не тем, как он отображается: Locked предотвращает изменение стиля, когда активна защита форматирования, IsQuickStyle контролирует, появляется ли он в галерее быстрых стилей, AutomaticallyUpdate заставляет стиль переопределять себя из вручную применённого прямого форматирования, SemiHidden и UnhideWhenUsed управляют видимостью в списке стилей до и после первого использования, а Priority влияет на порядок сортировки в галерее. Стиль также предоставляет свойства List и ListFormat, когда он определяет нумерацию списка, и Style.Remove() удаляет стиль из его StyleCollection.
Советы и рекомендации
- Отдавайте предпочтение индексу
StyleCollectionс значениемStyleIdentifier, а не поиску по имени при поиске встроенного стиля — имена локализованы, а значенияStyleIdentifier— нет. - Установите
BaseStyleNameдля построения иерархий стилей (например, набор стилей заголовков, которые все наследуют выбор шрифта от одного базового стиля) вместо повторения форматирования в каждом стиле. - При копировании стиля между документами используйте
StyleCollection.AddCopy(style), а не вручную считывать и повторно применять каждое свойство форматирования. - Настройте регионы
TableStyle.ConditionalStylesдля полосатых таблиц вместо ручного форматирования чередующихся строк в коде— каждый регионConditionalStyleформатируется на основе егоConditionalStyleType, а не путем прямой установки форматирования для отдельных строк. - Проверьте
Style.BuiltInперед программным удалением или переименованием стиля; встроенные стили обычно упоминаются по имени в других частях документа.
Распространённые проблемы
| Проблема | Причина | Исправление |
|---|---|---|
StyleCollection индексатор возвращает null при поиске имени | Имя стиля не существует в этом документе, или встроенный стиль ещё не использовался, поэтому Word его не создал | Проверьте Style.Aliases на наличие альтернативных имён, или используйте индексатор StyleCollection с StyleIdentifier для встроенных стилей вместо этого |
Установка StyleName неожиданно создаёт новый стиль | StyleName создаёт именованный стиль, если он ещё не существует в коллекции | Сначала используйте индексатор StyleCollection, чтобы убедиться, что стиль существует, или назначьте объект Style напрямую через свойство Style |
Полосатость таблицы не появляется после применения TableStyle | Области условного форматирования (OddRowBanding, EvenRowBanding и т.д.) никогда не были настроены на TableStyle.ConditionalStyles | Установите форматирование для соответствующих записей ConditionalStyle в ConditionalStyleCollection |
| Изменение стиля не влияет на контент, который уже использует этот стиль | Прямое (ручное) форматирование было применено поверх стиля и имеет приоритет | Очистите прямое форматирование в затронутых участках/абзацах или задайте Style.AutomaticallyUpdate |
FAQ
Как получить набор всех стилей в документе?
Прочитайте Document.Styles, который возвращает StyleCollection, содержащий все встроенные и пользовательские Style в этом документе.
В чём разница между Style и StyleIdentifier?
Style является фактическим объектом стиля с его форматированием; StyleIdentifier является независимым от локали значением перечисления, используемым для поиска конкретного встроенного стиля независимо от языка документа, через StyleCollection индексатор.
Чем стили таблиц отличаются от стилей абзаца или символа?
TableStyle — это подкласс Style, который добавляет свойства расположения таблицы (Alignment, CellSpacing, padding) и коллекцию ConditionalStyles для регионального форматирования, такого как чередующиеся строки, строки-заголовки и угловые ячейки — концепции форматирования, не применимые к стилям абзаца или символа.
Могу ли я создать совершенно новый стиль вместо изменения существующего?
Да — вызовите StyleCollection.Add(type, name), передав желаемый StyleType и новое имя, чтобы создать пустой стиль, затем задайте его свойства форматирования (Font, ParagraphFormat и т.д. для стилей абзаца/символа).
Как продублировать стиль, в том числе из другого документа?
Используйте StyleCollection.AddCopy(style), передавая объект Style (который может поступать из StyleCollection другого Document), чтобы добавить его копию в целевую коллекцию.
API Reference Сводка
| Класс/Метод | Описание: |
|---|---|
Style | Один встроенный или пользовательский стиль абзаца, символов, таблицы или списка |
StyleCollection | Коллекция всех стилей в документе, доступная через Document.Styles |
StyleCollection индексатор по имени | Найдите стиль по его отображаемому имени, например styles["Heading 1"] |
StyleCollection индексатор по идентификатору | Найдите встроенный стиль по независимому от локали идентификатору, например styles[StyleIdentifier.Heading1] |
StyleCollection.Add(type, name) | Создать новый, пустой стиль заданного StyleType |
StyleCollection.AddCopy(style) | Скопировать существующий стиль в эту коллекцию |
StyleType | Перечисление, различающее стили Paragraph, Character, Table и List |
StyleIdentifier | Идентификатор, не зависящий от локали, для встроенного стиля |
TableStyle | Подкласс Style для форматирования таблиц, включая условное стилизование по-регионно |
ConditionalStyleCollection | Набор по-регионных записей ConditionalStyle на TableStyle |
ConditionalStyle | Форматирование (шрифт, формат абзаца, затенение, границы, отступы) для одного региона таблицы |
ConditionalStyleType | Перечисление, определяющее, к какому региону таблицы применяется ConditionalStyle |