Срезы и временные шкалы
Срезы фильтруют таблицы, сводные таблицы и сводные диаграммы по элементам источника. Временные шкалы фильтруют поддерживаемые исходные поля дат сводного отчёта; столбцы таблиц, текстовые, вычисляемые и производные поля группировки не поддерживаются.
Режим плагина
Установка
pnpm add @univerjs-pro/sheets-slicer @univerjs-pro/sheets-slicer-uinpm install @univerjs-pro/sheets-slicer @univerjs-pro/sheets-slicer-uiyarn add @univerjs-pro/sheets-slicer @univerjs-pro/sheets-slicer-uibun add @univerjs-pro/sheets-slicer @univerjs-pro/sheets-slicer-uiИспользование
Добавьте следующий код в существующую настройку Sheets, настроив рисование и источник в виде таблицы или сводной таблицы. Загрузите локализацию и зарегистрируйте плагины до создания книги.
import { UniverSheetsSlicerPlugin } from '@univerjs-pro/sheets-slicer'import { UniverSheetsSlicerUIPlugin } from '@univerjs-pro/sheets-slicer-ui'import SheetsSlicerUILocale from '@univerjs-pro/sheets-slicer-ui/locale/ru-RU'import { LocaleType } from '@univerjs/core'import '@univerjs-pro/sheets-slicer/facade'import '@univerjs-pro/sheets-slicer-ui/lib/index.css'univerAPI.loadLocales(LocaleType.RU_RU, SheetsSlicerUILocale)univer.registerPlugin(UniverSheetsSlicerPlugin)univer.registerPlugin(UniverSheetsSlicerUIPlugin)Режим предустановки
Установка
pnpm add @univerjs/presets @univerjs/preset-sheets-core @univerjs/preset-sheets-drawing @univerjs/preset-sheets-advancednpm install @univerjs/presets @univerjs/preset-sheets-core @univerjs/preset-sheets-drawing @univerjs/preset-sheets-advancedyarn add @univerjs/presets @univerjs/preset-sheets-core @univerjs/preset-sheets-drawing @univerjs/preset-sheets-advancedbun add @univerjs/presets @univerjs/preset-sheets-core @univerjs/preset-sheets-drawing @univerjs/preset-sheets-advancedИспользование
Пресет Advanced включает модели, UI и Facade API срезов и временных шкал. Используйте его вместе с Core и Drawing и объедините переводы. Если Advanced уже подключён, добавьте slicer в его конфигурацию без повторной регистрации. Лицензия настраивается по руководству.
import { UniverSheetsAdvancedPreset } from '@univerjs/preset-sheets-advanced'import AdvancedLocale from '@univerjs/preset-sheets-advanced/locales/ru-RU'import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'import CoreLocale from '@univerjs/preset-sheets-core/locales/ru-RU'import { UniverSheetsDrawingPreset } from '@univerjs/preset-sheets-drawing'import DrawingLocale from '@univerjs/preset-sheets-drawing/locales/ru-RU'import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'import '@univerjs/preset-sheets-core/lib/index.css'import '@univerjs/preset-sheets-drawing/lib/index.css'import '@univerjs/preset-sheets-advanced/lib/index.css'const { univerAPI } = createUniver({ locale: LocaleType.RU_RU, locales: { [LocaleType.RU_RU]: mergeLocales(CoreLocale, DrawingLocale, AdvancedLocale), }, presets: [ UniverSheetsCorePreset({ container: 'app' }), UniverSheetsDrawingPreset(), UniverSheetsAdvancedPreset({ slicer: { maxMemberWindowSize: 200 } }), ],})При использовании Worker задайте useWorker: true у Advanced и зарегистрируйте UniverSheetsAdvancedWorkerPreset() в Worker. Он включает и расчёт срезов.
Создание среза
Пример использует сводную таблицу в I1 активного листа с исходным полем Region. Получите стабильный ID исходного поля через getSourceFieldsInfo(); отображаемое имя и ID поля отчёта нельзя передавать в newSlicer().
const fWorkbook = univerAPI.getActiveWorkbook()const fWorksheet = fWorkbook?.getActiveSheet()if (!fWorkbook || !fWorksheet) throw new Error('No active worksheet')const pivotTable = fWorkbook.getPivotTableByCell( fWorkbook.getId(), fWorksheet.getSheetId(), 0, 8,)const regionField = pivotTable?.getSourceFieldsInfo().find((field) => field.name === 'Region')if (!pivotTable || !regionField) throw new Error('Region source field not found')const slicer = await fWorksheet.insertSlicer( pivotTable.newSlicer(regionField.id) .setCaption(regionField.name) .setPosition('N2') .build(),)pivotTable.newSlicer() привязывает построитель к источнику. build() только готовит конфигурацию, а insertSlicer() создаёт элемент управления. Лист размещения может отличаться от листа источника, но они должны находиться в одной книге. Для обычной таблицы используйте fWorksheet.newSlicer(columnId).setTableReference({ subUnitId, tableId }), где columnId — стабильный ID столбца таблицы.
Создание временной шкалы
Следующий пример использует ту же сводную таблицу и требует исходное поле дат с именем Date. newTimeline() проверяет источник и отклоняет неподдерживаемые поля. API диапазонов временной шкалы принимают серийные значения Excel в системе дат книги, а не объекты JavaScript Date.
const dateField = pivotTable.getSourceFieldsInfo().find((field) => field.name === 'Date')if (!dateField) throw new Error('Date source field not found')const timeline = await fWorksheet.insertTimeline( pivotTable.newTimeline(dateField.id) .setCaption(dateField.name) .setLevel(univerAPI.Enum.TimelineLevel.Month) .setPosition('N18') .build(),)Поиск элементов и отслеживание изменений
Вызывайте getSlicer(viewId) / getSlicers() и getTimeline(viewId) / getTimelines() на листе размещения. viewId — ID, возвращаемый методом getId() элемента управления, а не ID рисунка.
Подписывайтесь на SlicerAdded, SlicerChanged, SlicerRemoved, TimelineAdded, TimelineChanged и TimelineRemoved через univerAPI.addEvent(). Эти события описывают зафиксированные локальные изменения, а не удалённое сохранение или завершение отрисовки. Когда подписка больше не нужна, вызовите её метод dispose().
Справочник API:
Запрос элементов и общие фильтры
setSelection() принимает типизированные значения источника: число 1, строка '1' и пустое значение различаются. Не передавайте подписи или индексы списка. Фильтр общий для всех представлений одного кэша и связанных отчётов. Для Table он заменяет фильтр данного столбца, сохраняя остальные. clearFilter() снимает фильтр.
import { FilterSelectionMode, RecordValueType } from '@univerjs/core'const accepted = await slicer.setSelection({ mode: FilterSelectionMode.Include, values: [{ type: RecordValueType.String, value: 'EMEA' }],})getItems({ start, count }) запрашивает окно данных, не меняя выбор. По умолчанию запрашивается 100 элементов, предел задаёт положительное целое maxMemberWindowSize (по умолчанию 200). Сохраняйте выбор за пределами окна. setConnections() заменяет связи со сводными отчётами; getConnectionCandidates() возвращает совместимые отчёты. Изменения требуют прав на соответствующие листы. См. FSheetSlicer.
Условия даты временной шкалы
setSelection({ startDate, endDate, useWholeDay: true }) расширяет дробные границы до целых дней, сохраняя целочисленную конечную границу исключённой. Без useWholeDay интервал точно равен [startDate, endDate). Фиксированное условие из сводной таблицы может быть непрерывным не всегда: читайте его через getDateCondition(). В этом случае getSelection() возвращает undefined, что само по себе не означает отсутствие фильтра.
Насколько полезно это руководство?