Занятие 5:
Работа с объектной моделью документов Р7
На занятии описаны:
    Объектная модель документов

    Объектная модель документов в редакторах Р7 во многом старается следовать объектной модели соответствующего типа для MS Office ранних его версий. При этом есть существенные отличия, которые для ряда задач, обычных для MS Office, делают их решение невозможным в Р7. Это прежде всего внешнее управление (автоматизация) через средства ОС Windows (используя технологии ActiveX и COM+). Такое ограничение делает затруднительным интеграцию через API в системы электронного документооборота (СЭД).

    Причина этих ограничений заключается в том, что изначально Р7 задумывался как мультиплатформенный офисный пакет. В основе его работы с документами лежит фреймворк Qt, однако редактор представляет собой веб-приложение, функционирующее на базе веб-браузера Chromium. Взаимодействие пользователя — это локальная навигация по панелям статичной страницы, и лишь небольшая часть области самого документа в редакторе через связку WebAsm обрабатывается бинарным ядром. Ограничения, накладываемые на браузеры, работающие с JavaScript, влияют на работу с локальной файловой системой компьютера (или смартфона).

    API для работы с документами в Р7 также ограничено по возможностям по сравнению с MS Office. Возможности редактора Р7 в основным соответствуют версии 6.0 MS Office.
    Основные отличия Р7 от MS Office

    Класс App vs. Application: В отличие от MS Office, вершиной API в Р7 является не класс Application (приложение), а класс App. Он вроде бы и должен ему соответствовать, но на деле скорее соответствует классу Document, так как не подразумевает большинство функций управления именно приложением редактора. Однако часть функций схожа и позволяет получить доступ к массиву загруженных документов, управлять записью и чтением документов, их экспортом или импортом и т.п.
    Рассмотрим в общем виде модели API документов для текстового и табличного редакторов (примеры и ссылки взяты с сайта опенсорсного решения OnlyOffice).
    Модель документа для текстового редактора
    Создание документа и элементов документа:

    Api
    Document
    Основные свойства документа, глобальные настройки цвета и заливки/обводки, стили, используемые во всем документе:
    ApiDocumentContent, ApiDocument, ApiStyle, ApiFill, ApiStroke, ApiGradientStop, ApiUniColor, ApiPresetColor, ApiRGBColor, ApiSchemeColor
    Section
    Свойства раздела документа:
    ApiSection
    Paragraph
    Общие свойства абзаца, общие свойства текста, свойства текущего абзаца, нумерация абзацев:
    ApiParaPr, ApiTextPr, ApiParagraph, ApiNumbering, ApiNumberingLevel
    Text run
    Общие свойства текста, текущие свойства прогона текста:
    ApiTextPr, ApiRun
    Image
    Общие свойства объекта, текущие свойства изображения:
    ApiDrawing, ApiImage

    Chart
    Общие свойства объекта, текущие свойства диаграммы:
    ApiDrawing, ApiChart

    Shape
    Общие свойства объекта, текущие свойства формы:
    ApiDrawing, ApiShape.
    Если внутри фигуры предусмотрено место для текста, в нее можно вставить всю структуру абзаца.

    Inline text content control
    Общие свойства текста, текущие свойства элемента управления встроенным текстовым содержимым:
    ApiTextPr, ApiInlineLvlSdt
    Text run
    Встроенный контроль текстового содержимого

    Hyperlink
    Текущие свойства гиперссылки:
    ApiHyperlink
    Table
    Общие стили таблиц, общие свойства таблиц, текущие свойства таблиц:
    ApiTableStylePr, ApiTablePr, ApiTable
    Table row
    Общие свойства строки таблицы, свойства текущей строки таблицы:
    ApiTableRowPr, ApiTableRow
    Table cell
    Общие свойства ячеек таблицы, свойства текущей строки таблицы:
    ApiTableCellPr, ApiTableCell
    Paragraph
    Table
    Block content control

    Table cell
    Общие свойства ячеек таблицы, свойства текущей строки таблицы:
    ApiTableCellPr, ApiTableCell
    Paragraph
    Table
    Block content control
    Общие свойства текста, свойства управления содержимым текущего блока:
    ApiTextPr, ApiBlockLvlSdt
    Paragraph

    Table

    Block content control
    Range
    Общие свойства текста, свойства текущего диапазона:
    ApiTextPr, ApiRange
    Paragraph


    Block content control
    Модель документа для табличного редактора
    Создание таблицы и элементов таблицы:

    Создание таблицы, глобальные настройки цвета и заливки/обводки:
    Api, ApiFill, ApiBullet, ApiStroke, ApiGradientStop, ApiUniColor, ApiPresetColor, ApiRGBColor, ApiSchemeColor, ApiName
    Worksheet
    Имя листа, формат ячейки в виде таблицы, ширина столбца, диаграммы:
    ApiWorksheet
    Range
    Свойства текста ячейки, формат текста ячейки (цвет, семейство шрифтов, размер, выравнивание), текстовое значение ячейки.:
    ApiRange
    Areas
    Свойства текущих областей:
    ApiAreas
    Comment
    Текущие свойства комментариев:
    ApiComment
    Image
    Общие свойства объекта, текущие свойства изображения:
    ApiDrawing, ApiImage

    Chart
    Общие свойства объекта, текущие свойства диаграммы:
    ApiDrawing, ApiChart
    Shape
    Общие свойства объекта, текущие свойства формы:
    ApiDrawing, ApiShape.
    Paragraph
    Общие свойства абзаца, текущие свойства абзаца, нумерация абзацев.:
    ApiParaPr, ApiParagraph
    Text run
    Общие свойства текста, текущие свойства выполнения текста:
    ApiTextPr, ApiRun

    Как работать с объектной моделью документов Р7

    Данные, приведенные выше, необходимы для понимания структуры и иерархии классов API. Например, если нам требуется создать или изменить что-то на уровне параграфа в текстовом документе, то цепочка доступа может быть такой:
    
    // В документе
    
    var oDocument = Api.GetDocument();
    var oFParagraph = oDocument.GetElement(0);
    oFParagraph.AddText("First paragraph");
    
    //Аналогично, для ячейки в таблице:
    
    var oWorksheet = Api.GetActiveSheet();
    var oRange = oWorksheet.GetRange("A1:C3");
    var oCell = oRange.GetCells(2, 1);
    oCell.SetFillColor(Api.CreateColorFromRGB(255, 213, 191));
    
    По ссылкам выше вы можете перейти на страницы с описанием самих классов и их методов. В каждом методе обычно приводится пример, который в режиме онлайн тут же исполняется в специальном окне с онлайн-версией редактора OnlyOffice (аналог Р7):
    Дополнительные материалы
    Для понимания работы АПИ документов рекомендуем ознакомится с разделом примеров написания макросов. Примеры необходимы, чтобы сформировать общее представление о механизмах работы API.
    Самостоятельное написание макросов является отличным способом понять, как устроен документ и как с ним можно взаимодействовать через API документов.
    Поддержка слушателей курса
    "Основы Java Script для Р7"