univer

dream-numApache-2.0活跃维护

Univer 是一套可扩展的开源 Office SDK,把表格、文档、幻灯片和 PDF 的编辑、计算、协作与文件处理能力嵌入你自己的产品,同时支持人和 AI Agent 操作。

Build your own AI office with Univer Office SDK. Bring editing, calculation, collaboration, and file processing into your product for people and AI agents. Built on an extensible open-source core.

v1.4.0发布于 2026-11-07 09:28 UTC23,038star +127 / 7 天1,941fork同步于 2026-11-10 23:25 UTC

怎么上手

由 README 提炼,执行前请确认
pnpm add @univerjs/presets @univerjs/preset-sheets-core
硬件要求按 README 说明

README 未说明,属于浏览器端 Web SDK,未提及显存或 GPU 要求

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

开源 Office SDK,把表格和文档编辑、公式计算与协作能力嵌进你自己的产品和 AI Agent

Univer 是一套可扩展的开源 Office SDK,把表格、文档、幻灯片和 PDF 的编辑、计算、协作与文件处理能力嵌入你自己的产品,同时支持人和 AI Agent 操作。

核心能力

  • 用 Preset 组合插件,几行代码嵌入表格编辑器
  • 通过 Facade API 读写工作簿、区域和公式结果
  • 命令系统统一处理跨功能编辑与撤销重做
  • workbook.save() 输出含插件数据的 JSON 快照
  • 支持无界面 Headless 复用内容模型与计算

容易踩的坑

所有 @univerjs/* 包需保持同一版本,商业包须匹配对应发布线;XLSX 导入导出属于单独分发的文件转换能力,不在开源包内;初始化后需等生命周期进入 Steady 再编辑,否则公式控制器可能未就绪

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v1.4.0
  1. v1.4.0🗂️ Release v1.4.0最新正式版2026-11-07 · 2026-11-07 09:28 UTC

    Univer 1.4.0 adds Office attachment workflows, shape merging in Slides, richer pivot filtering, and GETPIVOTDATA. This release also separates product-specific comment integrations and introduces several package and API migrations.

    New features

    Office attachments across Sheets, Docs, and Slides

    Preserve embedded OLE files when working with Office documents, with actions to preview, download, rename, and delete attachments. Supported Office files can also be converted into independent online documents when the application provides the required collaboration, attachment, and exchange services.

    Office export keeps the original embedded file by default. Applications can request the current confirmed version of a converted online document instead:

    import { ExchangeFormat } from '@univerjs-pro/exchange-client';
    
    const file = await univerAPI.exportSheetByUnitIdAsync(
        unitId,
        ExchangeFormat.XLSX,
        undefined,
        { oleAttachmentSource: 'online' }
    );
    

    The server must support this export option. Cross-type Office previews require the corresponding existing product UI module; conversion and preview use the existing drawing and exchange plugins.

    Merge shapes in Slides

    Combine supported selections with Union, Combine, Fragment, Intersect, and Subtract. The operations create new shape geometry and support undo/redo and collaboration. The first selected object determines the primary formatting and the subtraction direction.

    Multiple filters and whole-day date filtering

    Pivot tables and pivot charts can combine different filter categories on the same field after enabling Allow multiple filters per field. The option is off by default.

    Fixed date filters also support whole-day comparison, so timestamps from the same day can match without requiring identical time values.

    await pivotTable.setOptions({ allowMultipleFilters: true });
    
    await pivotTable.setDateFilter(fieldId, {
        operator: univerAPI.Enum.ST_PivotFilterOperatorEnum.dateEqual,
        expected: dateSerial,
        useWholeDay: true,
    });
    

    Disabling multiple filters while combined filters are active clears the report's filters and the corresponding shared slicer/timeline selections. The UI asks for confirmation.

    GETPIVOTDATA

    Use GETPIVOTDATA to retrieve aggregated values from a visible PivotTable report:

    =GETPIVOTDATA("Sales",$A$3,"Region","East")
    

    The initial implementation reads the visible report from a single-cell anchor, searching up to 200 rows below and 50 columns to its right.

    Paragraph word splitting

    Docs now respects paragraph settings that allow Latin words to break across lines. A new control in paragraph settings makes this behavior editable and supports inherited and mixed paragraph states.

    Product-specific comment integration packages

    Image and chart comment Facade integrations have moved out of the generic shape-thread-comment Facade into four new packages:

    PackageIntegration
    @univerjs-pro/sheets-drawing-thread-commentImages in Sheets
    @univerjs-pro/sheets-chart-thread-commentCharts in Sheets
    @univerjs-pro/docs-drawing-thread-commentImages in Docs
    @univerjs-pro/docs-chart-thread-commentCharts in Docs

    These packages provide the existing createCommentAsync, getComments, and listCommentsAsync methods for their respective objects. Generic FShape comments remain in @univerjs-pro/shape-thread-comment.

    Improvements and fixes

    • Formulas: Improve array-spill invalidation, shared-formula dependencies, and recalculation after worksheet-reference changes. Writing cell values through setValue/setValues now persists removal of the replaced formula.
    • Sheets: Preserve imported XLSX table differential formats and inherited font sizes while editing; improve merged-cell rendering, autofill after scrolling, and sheet renaming.
    • **UI a
  2. v1.3.1🕶️ Release v1.3.12026-11-02 · 2026-11-02 02:15 UTC
    查看更新说明

    Full changelog: v1.3.0…v1.3.1

  3. v1.3.0🎃 Release v1.3.02026-10-29 · 2026-10-29 12:35 UTC
    查看更新说明

    👻 Halloween is around the corner, and Univer 1.3.0 comes with a few treats 🎃 This release adds slicers, timelines, and expanded pivot grouping, alongside improvements to document editing, rendering performance, and everyday interactions.

    New features

    Slicers and timelines (Pro)

    Filter tables and pivot reports with interactive slicers. Timelines provide date-range filtering for pivot tables and pivot charts, with year, quarter, month, and day views.

    Three new packages provide the feature:

    PackagePurpose
    @univerjs-pro/slicerShared slicer and timeline models, rendering, and themes.
    @univerjs-pro/sheets-slicerWorksheet integration, data-source connections, commands, and Facade APIs.
    @univerjs-pro/sheets-slicer-uiInteractive controls, insertion menus, settings, and connection dialogs.

    These plugins and the slicer Facade API are included in UniverSheetsAdvancedPreset. For direct plugin integrations, register the Sheets Slicer and Sheets Slicer UI plugins and load the corresponding styles and locales.

    Expanded pivot grouping (Pro)

    Group selected items manually, organize numbers into ranges, and group dates by calendar units. These capabilities work with connected slicers and timelines for interactive report filtering.

    Code block fonts and table alignment (Pro)

    Code blocks now support built-in and custom monospaced fonts on desktop and mobile. Fonts registered with FontCategory.MONOSPACE are available in the code block font picker.

    Traditional documents also gain left, center, and right table alignment controls in the Ribbon.

    Conditional formatting: Stop If True

    Use “Stop If True” to prevent lower-priority formatting rules from applying when a rule matches. The rule editor and rule list now expose this setting.

    Improvements and fixes

    • UI: Move overflowing Ribbon groups into a compact More menu, improve the color picker, and support resetting sheet tab colors.
    • Sheets: Preserve text values during formatting, correct number-format colors, and retain table borders after filtering.
    • Sheets: Improve mobile editing and row/column resizing, and support Format Painter on row and column headers.
    • Docs: Improve block dragging, pasting, and focus handling across embedded editors and multiple instances.
    • Bases (Pro): Improve view tabs, hierarchical rows, and selection interactions.
    • Performance (Pro): Improve PDF scrolling and zooming, and reduce rendering work for 3D charts.
    • Collaboration and export (Pro): Provide clearer license errors, expose server rejection reasons through CollaborationConflict.message, and fix formatting loss in generated collaboration snapshots.

    Breaking changes and upgrading

    Keep all @univerjs/* and @univerjs-pro/* packages on the same version.

    Font categories now use an enum

    IFontConfig.category now accepts FontCategory from @univerjs/ui instead of string literals. Update custom font registrations and configuration:

     import type { IFontConfig } from '@univerjs/ui';
    +import { FontCategory } from '@univerjs/ui';
    
     const font: IFontConfig = {
         value: 'My Mono',
         label: 'My Mono',
    -    category: 'monospace',
    +    category: FontCategory.MONOSPACE,
     };
    

    The enum also provides SANS_SERIF, SERIF, DISPLAY, and HANDWRITING.

    Pivot date systems now use Core's DateSystem

    Replace PivotDateGroupFieldDateSystemEnum with DateSystem from @univerjs/core:

    -import { PivotDateGroupFieldDateSystemEnum, setDateSystem } from '@univerjs-pro/engine-pivot';
    +import { setDateSystem } from '@univerjs-pro/engine-pivot';
    +import { DateSystem } from '@univerjs/core';
    
    -setDateSystem(PivotDateGroupFieldDateSystemEnum.Date1900);
    +setDateSystem(DateSystem.Date1900);
    

    Use DateSystem.Date1904 for configurations using the 1904 date system.

    PDF unit helpers now come from Core

  4. v1.2.0🎉 Release v1.2.02026-10-22 · 2026-10-22 12:52 UTC
    查看更新说明

    New features

    • Docs: Support persistent heading collapse and enable outlines by default in modern mode.
    • Slides (Pro): Add dedicated picture and chart formatting tabs, with image cropping, sizing, and positioning controls.
    • Collaboration (Pro): Add conflict callbacks with access to unsynced edits, pending-write status, and retry events.

    Improvements and fixes

    • Formulas: Correct behavior in ISBLANK, AVERAGE, UNIQUE, and PROPER, and improve numeric literal parsing.
    • Sheets: Fix IME input and formula permission checks during autofill.
    • Images: Preserve aspect ratios on insertion and keep drawing anchors stable when hiding rows or columns.
    • Docs: Improve outline navigation, table layout, and popup positioning.
    • Docs (Pro): Improve collaborative table editing, undo/redo, and embedded content loading.
    • Slides (Pro): Improve thumbnail rendering and scrolling performance.
    • Charts (Pro): Improve axis and legend layout, label placement, and rendering during resizing.
    • Collaboration (Pro): Improve automatic retries, offline edit persistence, and status notifications.
    • PDFs (Pro): Fix missing fonts and images in imported documents.

    Breaking changes and upgrading

    • Collaboration loading (Pro): Automatic URL loading and enableUrlUnitLoader have been removed. Set the current user and load documents through the Facade APIs, or adapt the CustomUrlLoadPlugin example.
    • Import/export (Pro): Built-in import/export UI has moved to example plugins. Use the retained APIs or adapt the examples, and remove obsolete UI, locale, and style imports.
    • Collaboration events (Pro): Legacy conflict and permission UI events no longer fire; use CollaborationConflict. Replace the legacy submit-timeout UI event with CollaborationChangesetResend.
    • Docs collaboration (Pro): Upgrade clients and the collaboration backend together to include the shared transformation fixes for heading collapse and table editing.

    Full changelog: v1.1.0…v1.2.0

  5. v1.1.0🎉 Release v1.1.02026-10-17 · 2026-10-17 11:23 UTC
    查看更新说明

    New features

    • Sheets: Add workbook-level iterative calculation with configurable iteration limits and convergence thresholds.
    • Sheets: Support configurable line spacing for cell text.
    • Charts (Pro): Add 3D column, bar, line, area, and pie charts.
    • Charts (Pro): Support logarithmic value axes for 2D charts.
    • Docs: Add zoom and fullscreen controls to the toolbar.
    • Docs (Pro): Add table border presets to the ribbon.
    • PDFs (Pro): Add ribbon controls for editing, annotations, zoom, and fullscreen.
    • Collaboration (Pro): Allow hosts to disable automatic URL-based document loading.

    Improvements and fixes

    • Improve cell editing and worksheet-switch focus, and preserve table column order when saving.
    • Fix XLOOKUP error handling, SORT calculations, and named-range updates after worksheet renames.
    • Correct relative-date filtering and calendar boundaries.
    • Improve drawing positioning and selection, and prevent flicker when switching worksheets.
    • Pro: Improve document table resizing, selection performance, and shape-editing undo/redo.
    • Pro: Improve imported PDF text dragging, rendering, and editing.
    • Pro: Improve collaboration reconnection and offline edit recovery, and isolate offline caches by user.
    • Refine Slides menus and shape controls, mobile editing, and accessibility labels.

    Breaking changes and upgrading

    • Iterative calculation: Replace FFormula.setMaxIteration() and global cycle-reference settings with FWorkbook.setCalculationSettings(). Iterative calculation is disabled by default.
    • Node.js presets: @univerjs/preset-docs-node-core and @univerjs/preset-sheets-node-core are no longer included in new releases. Use plugin-based initialization for Node.js integrations.
    • Formula imports: Import FormulaReorderController from @univerjs/sheets-formula instead of @univerjs/sheets-formula-ui.
    • Custom chart renderers (Pro): EChartRenderModel no longer accepts constructor options, and IEChartRenderModelOptions is removed. Lifecycle handling now uses emitChartEvent() instead of cache-clearing hooks.
    • Collaboration (Pro): Sync pending offline edits before upgrading. Set the current user before loading documents. Hosts that manage document loading themselves can set enableUrlUnitLoader: false.

    Full changelog: v1.0.4…v1.1.0

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    💡 What is Univer?

    Univer is an Office SDK for building Office applications inside your own product. It provides Office editing, calculation, collaboration, and file processing for people and existing agents, using your data and permissions. The product family covers spreadsheets, documents, presentations, relational tables, canvases, and PDFs.

    Univer Office SDK has three parts:

    • Web SDK is the foundation: content models, editing, rendering, formula calculation, and Facade APIs (application-facing APIs). Compose its plugins into an embedded editor or your own Office application, and reuse the content models, commands, and calculation for Headless processing without an interactive editor.
    • Server SDK adds backend services for real-time collaboration, edit history, and Office file import and export.
    • AI SDK connects Office capabilities to existing agents and workflows, with content tools, execution, and review integrations.

    This repository provides the Web SDK's core architecture and engine implementations under Apache-2.0: content models and snapshot formats, plugin and dependency management, the command system, formula and rendering engines, Facade APIs, UI foundation, and Sheets and Docs editing capabilities. Commercial Web SDK plugins, Server SDK, and commercial AI SDK extensions are distributed and licensed separately.

    Agents can use the same open-source APIs; your application supplies the model and tool orchestration. The quotation example demonstrates editing, calculation, and saving without an AI SDK dependency.

    Open-source capabilities

    Features are composed through plugins and presets; the quick start uses only the Sheets Core preset. Images use the corresponding drawing plugins. See the feature comparison for detailed open-source and commercial coverage.

    The demos below showcase the wider Univer Office SDK, including commercial capabilities. They show more than the default open-source setup; see open source and commercial extensions for scope.

    🚀 Build on the open-source foundation

    Coordinate edits and undo/redo across features. Inserting a row inside a filter range changes both the base content and the filter range; undo needs to restore both. Each feature supplies its own changes and undo data, and the command composes their execution and history. The architecture walkthrough explains how to extend these editing workflows.

    Quick start: an open-source spreadsheet editor

    In a browser application using a bundler such as Vite:

    pnpm add @univerjs/presets @univerjs/preset-sheets-core
    

    Create the container before initializing Univer:

    <div id="app" style="height: 100vh"></div>
    
    import { UniverSheetsCorePreset } from '@univerjs/preset-sheets-core'
    import UniverPresetSheetsCoreEnUS from '@univerjs/preset-sheets-core/locales/en-US'
    import { createUniver, LocaleType, mergeLocales } from '@univerjs/presets'
    import '@univerjs/preset-sheets-core/lib/index.css'
    
    const { univerAPI } = createUniver({
      locale: LocaleType.EN_US,
      locales: {
        [LocaleType.EN_US]: mergeLocales(UniverPresetSheetsCoreEnUS),
      },
      presets: [
        UniverSheetsCorePreset({
          container: 'app',
        }),
      ],
    })
    
    univerAPI.createWorkbook({})
    

    Your page now contains a spreadsheet editor. Use the returned univerAPI to work with its content. This example uses open-source packages and needs no commercial Univer license or Server SDK.

    For component frameworks, retain the univer instance returned by createUniver and call univer.dispose() when the component unmounts. See the lifecycle guide.

    Presets compose plugins and register their Facade APIs. For manual control, see the Plugin Mode example below. The installation guide covers both modes, peer dependencies, and framework integrations.

    Keep coordinated @univerjs/* packages on the same version. Commercial packages must use the matching release line; independently released packages such as icons follow their declared compatibility. See the API Stability Policy.

    Connect your application to editable content

    Facade APIs are the application-facing interface to workbooks, worksheets, and ranges. Continue from the quick start to populate a quotation, update a quantity from application code, and read the recalculated total:

    // Wait for formula controllers before editing a newly created workbook.
    await new Promise<void>((resolve) => {
      if (univerAPI.getCurrentLifecycleStage() >= univerAPI.Enum.LifecycleStages.Steady) {
        resolve()
        return
      }
      const listener = univerAPI.addEvent(univerAPI.Event.LifeCycleChanged, ({ stage }) => {
        if (stage === univerAPI.Enum.LifecycleStages.Steady) {
          listener.dispose()
          resolve()
        }
      })
    })
    
    const workbook = univerAPI.getActiveWorkbook()!
    const sheet = workbook.getActiveSheet()
    
    sheet.getRange('A1:D4').setValues([
      ['Item', 'Quantity', 'Unit price', 'Amount'],
      ['Seats', 2, 25, '=B2*C2'],
      ['Support', 1, 100, '=B3*C3'],
      ['Total', '', '', '=SUM(D2:D3)'],
    ])
    
    // An application control or agent can make the same edit.
    sheet.getRange('B2').setValue(4)
    
    univerAPI.getFormula().onCalculationResultApplied().then(() => {
      console.log(sheet.getRange('D4').getValue()) // 200
      localStorage.setItem('quotation', JSON.stringify(workbook.save()))
    }).catch(console.error)
    

    The editor and your application operate on the same workbook; formula changes are recalculated automatically. workbook.save() returns a JSON snapshot containing the workbook and its registered plugin data. Your application owns persistence; this example uses browser storage. On a later page load, after initialization, restore the snapshot instead of creating a blank workbook:

    const saved = localStorage.getItem('quotation')
    if (saved) {
      univerAPI.createWorkbook(JSON.parse(saved))
    }
    

    This workflow uses only open-source packages. Snapshot persistence is separate from XLSX import and export, which uses the separately distributed file-conversion capabilities. Use public Facade APIs for application integration; the source links below explain internal implementation and extension points. See the API Stability Policy before depending on an extension point.

    Use Plugin Mode when you need precise control over plugin selection, dependencies, or loading. The preset above handles this composition for you.

    This alternative initialization uses the same app container and the Sheets Core preset's browser plugin stack without a Worker. Use it instead of the preset initialization, then run the same quotation example with the returned univerAPI.

    pnpm add @univerjs/core @univerjs/design @univerjs/docs @univerjs/docs-ui \
      @univerjs/engine-formula @univerjs/engine-render @univerjs/network \
      @univerjs/sheets @univerjs/sheets-ui @univerjs/sheets-formula \
      @univerjs/sheets-formula-ui @univerjs/sheets-numfmt \
      @univerjs/sheets-numfmt-ui @univerjs/ui
    
    import { LocaleType, mergeLocales, Univer } from '@univerjs/core'
    import { FUniver } from '@univerjs/core/facade'
    import DesignEnUS from '@univerjs/design/locale/en-US'
    import { UniverDocsPlugin } from '@univerjs/docs'
    import { UniverDocsUIPlugin } from '@univerjs/docs-ui'
    import DocsUIEnUS from '@univerjs/docs-ui/locale/en-US'
    import { UniverFormulaEnginePlugin } from '@univerjs/engine-formula'
    import FormulaEnUS from '@univerjs/engine-formula/locale/en-US'
    import { UniverRenderEnginePlugin } from '@univerjs/engine-render'
    import { UniverNetworkPlugin } from '@univerjs/network'
    import { UniverSheetsPlugin } from '@univerjs/sheets'
    import SheetsEnUS from '@univerjs/sheets/locale/en-US'
    import { UniverSheetsFormulaPlugin } from '@univerjs/sheets-formula'
    import SheetsFormulaEnUS from '@univerjs/sheets-formula/locale/en-US'
    import { UniverSheetsFormulaUIPlugin } from '@univerjs/sheets-formula-ui'
    import SheetsFormulaUIEnUS from '@univerjs/sheets-formula-ui/locale/en-US'
    import { UniverSheetsNumfmtPlugin } from '@univerjs/sheets-numfmt'
    import { UniverSheetsNumfmtUIPlugin } from '@univerjs/sheets-numfmt-ui'
    import SheetsNumfmtUIEnUS from '@univerjs/sheets-numfmt-ui/locale/en-US'
    import { UniverSheetsUIPlugin } from '@univerjs/sheets-ui'
    import SheetsUIEnUS from '@univerjs/sheets-ui/locale/en-US'
    import { UniverUIPlugin } from '@univerjs/ui'
    import UIEnUS from '@univerjs/ui/locale/en-US'
    import '@univerjs/design/lib/index.css'
    import '@univerjs/ui/lib/index.css'
    import '@univerjs/docs-ui/lib/index.css'
    import '@univerjs/sheets-ui/lib/index.css'
    import '@univerjs/sheets-formula-ui/lib/index.css'
    import '@univerjs/sheets-numfmt-ui/lib/index.css'
    import '@univerjs/network/facade'
    import '@univerjs/docs/facade'
    import '@univerjs/docs-ui/facade'
    import '@univerjs/engine-formula/facade'
    import '@univerjs/sheets/facade'
    import '@univerjs/ui/facade'
    import '@univerjs/sheets-ui/facade'
    import '@univerjs/sheets-formula/facade'
    import '@univerjs/sheets-numfmt/facade'
    import '@univerjs/sheets-formula-ui/facade'
    
    const univer = new Univer({
      locale: LocaleType.EN_US,
      locales: {
        [LocaleType.EN_US]: mergeLocales(
          DesignEnUS,
          DocsUIEnUS,
          FormulaEnUS,
          SheetsEnUS,
          SheetsFormulaEnUS,
          SheetsFormulaUIEnUS,
          SheetsNumfmtUIEnUS,
          SheetsUIEnUS,
          UIEnUS,
        ),
      },
    })
    
    univer.registerPlugin(UniverNetworkPlugin)
    univer.registerPlugin(UniverDocsPlugin)
    univer.registerPlugin(UniverRenderEnginePlugin)
    univer.registerPlugin(UniverUIPlugin, { container: 'app' })
    univer.registerPlugin(UniverDocsUIPlugin)
    univer.registerPlugin(UniverFormulaEnginePlugin)
    univer.registerPlugin(UniverSheetsPlugin, {
      onlyRegisterFormulaRelatedMutations: false,
    })
    univer.registerPlugin(UniverSheetsUIPlugin, {
      protectedRangeShadow: true,
    })
    univer.registerPlugin(UniverSheetsNumfmtPlugin)
    univer.registerPlugin(UniverSheetsNumfmtUIPlugin)
    univer.registerPlugin(UniverSheetsFormulaPlugin)
    univer.registerPlugin(UniverSheetsFormulaUIPlugin)
    
    const univerAPI = FUniver.newAPI(univer)
    univerAPI.createWorkbook({})
    

    The Docs plugins support spreadsheet rich-text editing. When adding a feature, include its corresponding Facade extensions, locale bundles, and UI styles. Dispose univer when its container is unmounted.

    🏗️ Explore the open-source architecture

    Give custom features clear boundaries

    Univer organizes content logic and UI interaction in separate plugins. Feature plugins manage rules and content changes; UI plugins provide the interface and user interactions. For example, sheets-filter manages filter ranges and rules, while sheets-filter-ui provides panels, menus, and shortcuts.

    %%{init: {'htmlLabels': false, 'theme': 'base', 'themeVariables': {'fontFamily': 'Arial, PingFang SC, Microsoft YaHei, sans-serif', 'fontSize': '17px', 'lineColor': '#64748b'}, 'flowchart': {'htmlLabels': false, 'curve': 'linear', 'nodeSpacing': 28, 'rankSpacing': 45, 'padding': 16, 'wrappingWidth': 270}}}%%
    %% A layered overview, not a complete dependency graph.
    %% Group arrows indicate reuse of the layer below; internal arrows show selected dependencies.
    flowchart TD
      subgraph FEATURES["Feature Plugins"]
        direction LR
        FUI["Filter<br/>UI Plugin"]
        VUI["Data Validation<br/>UI Plugin"]
        FILTER["Filter Plugin"]
        VALIDATION["Data Validation Plugin"]
        FUI --> FILTER
        VUI --> VALIDATION
      end
    
      subgraph PRODUCTS["Product Plugins"]
        direction LR
        SUI["Sheets UI Plugin"]
        SHEETS["Sheets Plugin"]
        SUI --> SHEETS
      end
    
      subgraph FOUNDATION["Core Framework & Plugins"]
        direction LR
        UI["UI Plugin"]
        FORMULA["Formula Engine Plugin"]
        RENDER["Render Engine Plugin"]
        CORE["Core"]
        UI --> RENDER
        RENDER --> CORE
        FORMULA --> CORE
      end
    
      FEATURES --> PRODUCTS
      PRODUCTS --> FOUNDATION
    
      classDef logic fill:#eff6ff,color:#17365f,stroke:#93b4df,stroke-width:1.5px
      classDef ui fill:#f0fdf4,color:#17543a,stroke:#91c8a7,stroke-width:1.5px
      classDef shared fill:#f6f7f9,color:#334155,stroke:#bac3ce,stroke-width:1.5px
      classDef feature fill:#172d50,color:#ffffff,stroke:#172d50
      class FUI,VUI ui
      class FILTER,VALIDATION logic
      class SUI,SHEETS logic
      class UI,FORMULA,RENDER,CORE shared
    
      style FEATURES fill:#f7fcf9,stroke:#b5d8c1,color:#17543a
      style PRODUCTS fill:#f5f9ff,stroke:#b6cbea,color:#17365f
      style FOUNDATION fill:#fafbfc,stroke:#cbd2dc,color:#334155
    

    Figure 1: three plugin layers. Feature plugins build on product plugins, which reuse the core framework and plugins. Group arrows show dependencies on the layer below; Core provides content models, commands, dependency injection, and lifecycle management. Some plugins and dependencies are omitted.

    New features keep their rules in their own plugins and cooperate through public services, commands, and defined extension points. UI plugins build on shared UI services and components.

    Dependencies are explicit at two levels:

    • Between plugins: DependentOn declares runtime plugin dependencies. The plugin service orders them, and lifecycle stages separate dependency registration, content initialization, and UI initialization.
    • Inside plugins: dependency injection connects controllers and services through declared dependencies. Supported overrides let an application replace an implementation, adapt a platform service, or supply a test double. Instance-scoped injectors keep application state separate between Univer instances.

    Disposable registration also gives commands, listeners, components, and icons a cleanup path when their owner is disposed.

    The filter plugin and its UI plugin show these boundaries in working code.

    For filtering, sheets-filter owns content logic and sheets-filter-ui owns UI interaction. Each module has a focused responsibility.

    %%{init: {'htmlLabels': false, 'theme': 'base', 'themeVariables': {'fontFamily': 'Arial, PingFang SC, Microsoft YaHei, sans-serif', 'fontSize': '17px', 'lineColor': '#64748b'}, 'flowchart': {'htmlLabels': false, 'curve': 'linear', 'nodeSpacing': 28, 'rankSpacing': 45, 'padding': 16, 'wrappingWidth': 270}}}%%
    %% Every arrow means contains. This is code organization, not execution order.
    flowchart LR
      FEATURE["Filter Feature"]
      LOGIC["Filter Plugin"]
      UI["Filter UI Plugin"]
      MODEL["Model"]
      SERVICE["Service"]
      CONTROLLER["Controller"]
      COMMAND["Command / Mutation"]
      FACADE["Facade API"]
      VIEW["View"]
      UICTRL["UI Controller"]
      UISERVICE["UI Service"]
      FEATURE --> LOGIC
      FEATURE --> UI
      LOGIC --> MODEL
      LOGIC --> SERVICE
      LOGIC --> CONTROLLER
      LOGIC --> COMMAND
      LOGIC --> FACADE
      UI --> VIEW
      UI --> UICTRL
      UI --> UISERVICE
    
      classDef logic fill:#eff6ff,color:#17365f,stroke:#93b4df,stroke-width:1.5px
      classDef ui fill:#f0fdf4,color:#17543a,stroke:#91c8a7,stroke-width:1.5px
      classDef shared fill:#f6f7f9,color:#334155,stroke:#bac3ce,stroke-width:1.5px
      classDef feature fill:#172d50,color:#ffffff,stroke:#172d50
      class FEATURE feature
      class LOGIC,MODEL,SERVICE,CONTROLLER,COMMAND,FACADE logic
      class UI,VIEW,UICTRL,UISERVICE ui
    

    Figure 2: code organization. Arrows mean “contains.” Both plugins can contain Controllers and Services: logic Controllers coordinate content changes and related features; UI Controllers connect menus, shortcuts, and interactions, with UI Services managing panel state. These responsibilities give new features a consistent structure to implement and test.

    The UI foundation follows the same division. @univerjs/design supplies shared components and styles, @univerjs/ui provides workbench services such as menus, shortcuts, panels, and component registration, and @univerjs/icons supplies icons. A feature registers its components and icons, contributes menus, and attaches its rendering through these extension points. Teams can add a panel or toolbar feature while reusing the application's UI infrastructure. See the UI overview and the filter plugin's component and icon registration.

    Compose cross-feature edits and undo/redo

    For example, when rows are inserted inside a filter range, the filter plugin supplies the corresponding range change and its undo data. The row command composes the base edit and participating feature changes, executes them, and records their undo/redo information together. The row insertion feature can use the shared extension mechanism while the filter plugin owns its range-update rules.

    The command system distinguishes three kinds of action:

    • Command orchestrates a business action and the changes it requires.
    • Mutation changes content saved in a snapshot, with serializable parameters.
    • Operation changes transient state, such as an open panel or the scroll position.

    A shared structure for undo/redo. For an undoable edit, the feature implementation supplies the forward mutations and corresponding inverse mutations, and the Command records them through IUndoRedoService. When one action affects several features, the Command can combine their changes and undo data in a single undo/redo record, so the user can undo and redo the complete action. See extending commands.

    Features still need to cooperate. Interceptors and reference-range handlers give that cooperation a defined place. At supported extension points, plugins contribute checks or related mutations; interceptor priorities control ordering where the API defines it.

    %%{init: {'htmlLabels': false, 'theme': 'base', 'themeVariables': {'fontFamily': 'Arial, PingFang SC, Microsoft YaHei, sans-serif', 'fontSize': '17px', 'lineColor': '#64748b'}, 'flowchart': {'htmlLabels': false, 'curve': 'linear', 'nodeSpacing': 28, 'rankSpacing': 45, 'padding': 16, 'wrappingWidth': 270}}}%%
    %% Simplified insert-row example. A command composes mutations and records undo after success.
    %% Events may also fire for nested command executions; not every callback is drawn.
    flowchart TD
      BEFORE["Before execution<br/>Inspect or cancel"]
      CMD["Insert-row Command"]
      BASE["Row mutations"]
      EXT["Feature extension points<br/>Filter range changes"]
      MODEL["Execute combined mutations"]
      UNDO["Record undo and redo"]
      AFTER["After execution<br/>Notify listeners"]
      BEFORE --> CMD
      CMD --> BASE
      CMD --> EXT
      BASE --> MODEL
      EXT --> MODEL
      MODEL --> UNDO
      UNDO --> AFTER
      classDef entry fill:#f6f7f9,color:#334155,stroke:#bac3ce,stroke-width:1.5px
      classDef core fill:#eff6ff,color:#17365f,stroke:#93b4df,stroke-width:1.5px
      classDef extension fill:#f0fdf4,color:#17543a,stroke:#91c8a7,stroke-width:1.5px
      class BEFORE,AFTER entry
      class CMD,BASE,MODEL,UNDO core
      class EXT extension
    

    This diagram simplifies an insert-row workflow. Nested command executions have their own callbacks; it does not show every event or the separate Operation path. See the row command, filter controller, and interceptor service.

    These boundaries support a practical testing strategy: test models and services independently, replace external dependencies through DI, and add regression cases for combined actions and undo/redo. The filter controller tests exercise row and column changes and their effect on filtering.

    Connect applications and agents through Facade APIs and events

    The repository includes the content models, formula engine, and Canvas rendering and layout engine behind the editors. They are shared building blocks: spreadsheet rich text, for example, reuses document layout and rendering. Custom features can build on these engines instead of implementing a separate content stack. Read about the formula engine architecture and rendering engine architecture.

    Browser editors, Node.js Headless tasks, and appropriately composed Workers can reuse the corresponding content plugins, models, commands, and calculation. See Headless Univer and the isomorphic architecture.

    ICommandService exposes execution callbacks so plugins can observe commands before and after execution. Facade APIs wrap the underlying capabilities in application objects such as FWorkbook, FWorksheet, and FRange.

    Each plugin contributes its own Facade extensions, typed events through univerAPI.Event, and enums through univerAPI.Enum. Application code can discover event names and constants from one entry point instead of importing private services or repeating strings. For example, BeforeCommandExecute can inspect and cancel an execution; CommandExecuted reports executions to listeners. Listeners return disposables, and cancellation applies where the event supports it.

    Facade extensions stay with their feature packages, so a content API does not have to pull in unrelated UI APIs. See the Facade design, command callbacks and event bridge, and Enum entry point.

    The repository provides working feature implementations and patterns for extending them. Read the filter implementation walkthrough for a complete example, or the API Stability Policy before depending on an extension point.

    🧩 Extend your application with Univer Office SDK

    When you want more ready-to-integrate capabilities, compose the corresponding Univer Office SDK modules: additional content types, advanced editing plugins, collaboration, file conversion, and agent tooling. They extend the same content models, plugin architecture, command system, and Facade design introduced above, so you can build on your existing integration.

    Scope and licensing

    • This repository: Apache-2.0 packages that can be used in commercial applications under that license, including the open-source Headless content capabilities.
    • Commercial extensions: Commercial Web SDK plugins, Server SDK, and AI SDK capabilities beyond the open-source foundation are distributed and licensed separately. Freemium evaluation includes watermarks and feature limits.
    • Reference applications: Open-source applications such as Univer Workspace have their own source licenses. Their SDK dependencies retain their respective licenses.

    See the feature comparison, including its Open source only filter, for detailed coverage and plans and licensing for commercial options.

    These capabilities operate on serializable Unit snapshots, including Sheets' IWorkbookData, Docs' IDocumentData, Slides' ISlideData, and canvases' IBoardData (called Boards in the API). These types come from core and the respective product packages; current Slides and Boards capabilities are separately distributed commercial products. The shared Unit conventions let browser editors, backend services, and agents work with the same content.

    Commands orchestrate edits; Mutations describe content changes. Collaboration packages those mutations into changesets, applies operational transformation (OT) to concurrent changes, and manages confirmed revisions and snapshots. History can reconstruct a revision from a snapshot and subsequent changesets. Read the collaboration design and Collaboration SDK overview.

    Exchange maps Office file structures to and from Univer content snapshots. For OOXML formats such as XLSX, DOCX, and PPTX, it parses the file into the corresponding Sheet, Doc, or Slide data and generates the file representation on export. The converted content can enter the same editing, calculation, collaboration, and agent workflows. See Office file import and export.

    AI SDK builds on the Web SDK's Headless content models, commands, calculation, and Facade APIs. It exposes structured TypeScript APIs and optional Commander presets that applications can compose into their own Office CLI or agent tools.

    • Understand, discover, and edit. Inspection returns structured content. API Reference helps the agent find Facade symbols and signatures shipped with its SDK. Facade execution distinguishes read and write modes, captures mutations, and works with explicit synchronization and commit results. See content operations.
    • Check the rendered result. A browser Render Runtime reuses Web SDK rendering for screenshots. Slide layout lint adds structured findings for issues such as off-page or overlapping text, giving the agent evidence for another editing pass. See visual inspection.
    • Edit drafts for human review. With the corresponding collaboration and Web capabilities, agents can edit and verify an isolated Worktree draft over several rounds, then hand it to a person to review, merge, or reopen. The workflow uses the same snapshots, mutations, and revision conventions. See Worktree.

    For repeated calls, optional Worker pools and a daemon reuse loaded content instances and reduce repeated initialization. Your application owns the root CLI, targets, authorization, and output. Explore the AI SDK package catalog to select the required capabilities.

    🌐 Application patterns and ecosystem

    Univer Workspace: an Office SDK reference application

    For a complete application reference, start with Univer Workspace. It shows how to compose Univer Office SDK editors, collaboration, file capabilities, existing agents, and human review into a self-hostable workspace. Follow its integration patterns when building your own Office application or agent workspace.

    Workspace is open source; its SDK dependencies follow their respective licenses. See the Workspace overview for connected apps and review workflows.

    Watch an SDK integration demo

    CLI, agent integrations, and developer skills

    The same SDK capabilities can also be composed into the agents and tools you already use:

    Each repository documents its setup and SDK dependencies. Explore the ecosystem for agent entry points, or the documentation to build your own integration.

    📚 Documentation and contributing

    Thanks to all contributors who build and improve Univer. Contributions to engines, plugins, tests, documentation, and examples are welcome.

    Runtime compatibility

    • Polyfills: Univer relies on Intl.Segmenter. Add a polyfill such as @formatjs/intl-segmenter if your target browser or runtime does not provide it.
    • Build tools: We recommend Vite, esbuild, or Webpack 5. If your build tool does not support the exports field in package.json (common in Webpack 4), you may need extra path mapping.
    • React: Univer's view layer is built on React 18, supports React 18 and 19, and provides minimal compatibility support for React 16.9+ and 17.
    • Node.js runtime: Headless Univer supports Node.js >=18.17.0. Developing this monorepo requires Node.js >=22.18.

    Repository layout

    .
    ├── packages/      Core packages, engines, document types, UI plugins, and feature plugins
    ├── examples/      All-in-one Vite workbench used for local browser development
    ├── common/        Shared internal tooling, storybook, and utilities
    ├── tests/         Additional integration test projects
    └── docs/          Architecture notes, images, and repository-local documentation
    

    Package-level READMEs live beside each package under packages/.

    Local development

    Requirements:

    • Node.js >=22.18
    • pnpm: use the version declared by packageManager in package.json.
    git clone https://github.com/dream-num/univer.git
    cd univer
    pnpm install
    pnpm dev
    

    Useful commands:

    Read CONTRIBUTING.md before opening a pull request.

    💬 Community

    Ask questions in GitHub Discussions, join Discord, and follow X or YouTube. Please read the Code of Conduct.

    🔒 Security

    If you believe you have found a security issue, please follow the Security Policy.

    ❤️ Sponsors

    Univer is supported by the community and sponsors. You can support the project through Open Collective.

    📄 License

    Copyright (c) 2021-present DreamNum Co., Ltd.

    The open-source packages in this repository are licensed under Apache-2.0. Commercial SDK modules are distributed and licensed separately.