Web SDK

Текстовые диапазоны и абзацы

Модель на основе индексов

Univer Docs не хранит форматированный текст в виде вложенного дерева. Обычный текст хранится в body.dataStream1, а стили и структура привязываются к нему с помощью диапазонов индексов.

Наиболее распространённые структуры на основе индексов:

  • ITextRun: диапазон стиля символов.
  • IParagraph: метаданные и стиль абзаца.
  • ISectionBreak: метаданные разрыва раздела.

ITextRun

ITextRun описывает стиль непрерывного диапазона текста.

СвойствоТипОписание
stnumberНачальный индекс включительно.
ednumberКонечный индекс не включительно.
sId?stringИдентификатор связанного стиля.
ts?ITextStyleОбъект стиля символов.
TypeScript
const body: IDocumentBody = {  dataStream: 'Hello Univer\r\n',  textRuns: [    {      st: 0,      ed: 5,      ts: { bl: 1 },    },    {      st: 6,      ed: 12,      ts: { cl: { rgb: '#2563eb' } },    },  ],}

В этом примере Hello выделено полужирным, а Univer — синим цветом. Разрыв абзаца \r\n не входит в стилизованные диапазоны.

IParagraph

IParagraph описывает метаданные уровня абзаца. startIndex указывает на позицию разрыва абзаца в dataStream.

СвойствоТипОписание
startIndexnumberИндекс разрыва абзаца.
paragraphIdstringСтабильный идентификатор абзаца.
paragraphStyle?IParagraphStyleСтиль абзаца, например выравнивание, отступы, межстрочный интервал и тип заголовка.
bullet?IBulletМетаданные маркера списка.
TypeScript
const body: IDocumentBody = {  dataStream: 'Hello Univer\r\nSecond line\r\n',  paragraphs: [    {      startIndex: 12,      paragraphId: 'p-1',      paragraphStyle: {        namedStyleType: NamedStyleType.HEADING_1,      },    },    {      startIndex: 25,      paragraphId: 'p-2',    },  ],}

ISectionBreak

ISectionBreak также использует индекс для привязки настроек раздела к текстовому потоку. Для отдельного раздела он позволяет переопределить размер страницы, поля, колонтитулы, колонки и направление текста.

TypeScript
const body: IDocumentBody = {  dataStream: 'First section\nSecond section\r\n',  sectionBreaks: [    {      startIndex: 13,      pageSize: { width: 595, height: 842 },      marginTop: 72,      marginBottom: 72,    },  ],}

Примечания

  • Следите, чтобы индексы соответствовали dataStream. Неверные индексы могут привести к рассогласованию диапазонов стилей, абзацев, выделения или отрисовки.
  • Для редактирования активного документа рекомендуется использовать Facade API и команды.
  • При создании снимка вручную сначала сформируйте dataStream, а затем вычислите по этой строке диапазоны и позиции абзацев.

Footnotes

  1. Смещения измеряются в кодовых единицах UTF-16 JavaScript, а не видимых символах: "😀".length равно 2. Текстовый диапазон [st, ed) не включает конец, в отличие от диапазонов ячеек. ↩

Насколько полезно это руководство?

© 2026 DreamNum Co., Ltd.