paged.sheet — live spreadsheets in print

Excel workbooks, set in the layout

A spreadsheet engine in the page: real Excel workbooks with live formulas, tables and charts that paginate like print, and save back as XLSX.

AGPL-3.0 OR PMEL·canary — usable, moving fast·0.1.0-canary.15·github.com/paged-media/plugin-sheets ↗

263
functions, LET and LAMBDA included
93.6%
of 60,419 real formula cells match Excel
10
chart kinds
A real calculation engine

263 functions, checked against Excel

paged.sheet is a Rust spreadsheet engine compiled to WebAssembly. All 263 registered functions are implemented, LET and LAMBDA with its helpers among them; dynamic arrays spill and nest; Excel tables answer structured references; recalculation is incremental, volatile cells carry their dependents, and iterative calculation runs when the workbook asks for it.

The proof is Excel itself. Recalculating real workbooks reproduces the value Excel saved in the file for 93.6% of comparable formula cells — shared formulas, defined names, whole-column references, legacy array formulas and all.

Formulas, spill and the roster: a lowered range prints results — a SUM, an uppercase call, a SEQUENCE spilling from one anchor — above the function library by family, counted when the Annual was built (224 then; 263 now).
Formulas, spill and the roster: a lowered range prints results — a SUM, an uppercase call, a SEQUENCE spilling from one anchor — above the function library by family, counted when the Annual was built (224 then; 263 now).
[ 56,533 / 60,419 ]real formula cells match Excel's saved value, over 201 workbooks
[ 1,470 / 1,485 ]recorded function cases agree with Excel
[ 148 / 164 ]number-format cases agree; every disagreement a recorded ruling
A range on the page

Native tables that follow the workbook — and paginate

Place a range and it becomes one text frame holding a native table: the workbook’s fills, borders, fonts and conditional formatting, merged cells, numbers aligned right, column widths measured with the document’s own font metrics, and data bars drawn under the table.

Edit the workbook and every placed table refreshes in place — only changed cells re-poured, in one document write and one undo step. One command threads a long range over linked frames, repeats the header rows in every frame, and re-paginates when a frame is resized.

The Ledger opener: a spreadsheet in a page document leads two lives — the live grid you type into, and what the plugin lowers to native content that persists.
The Ledger opener: a spreadsheet in a page document leads two lives — the live grid you type into, and what the plugin lowers to native content that persists.
The grid in the frame
Click, drag and shift selection, arrows, Tab and F2, a cell editor with function completion, copy and paste with references re-addressed, the fill handle with series.
The Workbook panel
Sheets, ranges, sort, find and replace, charts, cell styles, number formats, borders, merge, freeze, defined names, rows and columns.
Undo that makes sense
Every committed cell edit is one step; so is each sort, paste, fill and format change.
Five display locales
Number formats render in five locales, taken from the workbook on load.
Charts

Ten kinds, drawn as paths — never a picture

Charts are read from the workbook or authored over a range, then placed as vector paths and labelled text frames in one document write — and replaced in one write when their data changes. Their colours are document swatches; the host’s Swatches panel edits the workbook’s chart colours.

The Paged Annual — chart-wall
The Paged Annual — charts
The chart wall: one workbook, ten charts — column, bar, stacked column, stacked bar, line, area, pie, donut, scatter and radar. Every bar, wedge and spoke is a native path; every axis number is a text frame.
Live — paged.sheet as its own application

The spreadsheet, in this tab

Solo mode boots the real editor as paged.sheet. Open an .xlsx, CSV or TSV file or start a blank workbook; the calculation runs in your browser and your file stays on your machine.

The paged editor booted as paged.sheet
Needs a browser with WebGPU (Chrome, Edge, Safari 26).open full screen ↗
How it lives in a document

The workbook travels as XLSX; the page is native

The workbook’s own bytes are stored in the .paged container and re-saved after every committed edit, so a reload restores the edited workbook. What the page shows — tables, data bars, charts — is lowered to native frames, tables and paths, so InDesign opens the IDML and sees real tables, not images.

Export writes an .xlsx in which every part the session did not touch keeps its original bytes — pivot caches, macros and parts the engine never interprets included.

A publishing instrument with a real engine underneath.

The full list of what ships and what does not is in the repository’s status record ↗.

Spec sheet — from the registry, not from marketing

paged.sheet features

Plugin · sheet · 44
paged.sheet serves the HOST Swatches and Character/Paragraph panels (ADR 023 phase D)
sheet.binding-providers
stable· untested
Exact-decimal numeric mode (D-6 spike) — seam proven, deferred to v2 opt-in
sheet.calc.decimal
experimental· 3 tests
Calculation engine — dependency graph, dirty recalc, f64 numeric core (D-6), coercion, error values
sheet.calc.engine
stable· 74 tests
Iterative (circular) calculation — OFF by default (D-7), converges to a fixed point when enabled
sheet.calc.iterative
stable· 2 tests
Row/col insert-delete wasm door — structural re-emission, refused over preserved cell addresses
sheet.calc.rewrite.structural-door
experimental· untested
Dynamic-array spill (anchor + spill range,
sheet.calc.spill
stable· 7 tests
Chart authoring — create a chart from the editor (page-side lowering)
sheet.chart.authoring
stable· 1 test
Charts — plotters-backed custom DrawingBackend → frozen ChartGeometry IR → grid view + paged.draw page lowering
sheet.chart.engine
stable· 38 tests
Graph types — stacked column/bar + radar, axis titles, transpose rows/columns, c:grouping import
sheet.chart.graphs
stable· 6 tests
Data-provider CONSUMER — source a sheet from a governed dataset (host.dataProviders)
sheet.data.consumer
stable· 2 tests
Multi-cell copy/paste — formulas re-addressed on paste, tabular payload, TSV interop, tiling
sheet.edit.clipboard
experimental· untested
Fill handle and fill down/right — number, date, weekday/month and numbered-text series; formulas re-addressed
sheet.edit.fill
experimental· untested
Session edit ops — stable range sort (values lane), find over values/formulas, replace with skip reporting
sheet.edit.ops
stable· 17 tests
Host Cmd-Z reaches sheet edits outside the modal session (ADR-012 Tier 2)
sheet.edit.undo
experimental· untested
Function library — 224 registered functions across 18 families, registry-driven dispatch
sheet.fn.library
stable· 732 tests
Cell formatting — number format, font, fill, borders, alignment, wrap (setStyle) persisted to styles.xml
sheet.format.cell-style
experimental· untested
Number-format engine + en/de locale (D-8)
sheet.format.engine
stable· 88 tests
Western-European Latin locale tier (fr/es/it) — display formatting data rows
sheet.format.locale.latin-tier
stable· 1 test
Find in sheet — a find field in the grid panel; next/previous select and reveal the match in-frame
sheet.grid.find
experimental· untested
Frozen panes — parse sheetViews/pane + render frozen rows/columns in-grid
sheet.grid.freeze.render
stable· 2 tests
In-frame grid — sceneLayer render + K-1 modal select/edit (sheets-mode lite)
sheet.grid.inframe
experimental· 33 tests
Grid keys — arrows, Tab/Enter, F2, Delete, Esc, PageUp/Down and Cmd shortcuts in-frame and in the panel
sheet.grid.keyboard
experimental· untested
Range selection — drag, shift-click and shift-arrows in the grid panel and in-frame
sheet.grid.selection
experimental· untested
CSV / TSV import as a one-sheet workbook, typed by locale
sheet.import.csv
experimental· untested
Freeze panes — set / clear (sheetView pane) from the panel
sheet.layout.freeze
experimental· untested
Merge / unmerge cells (model, xlsx mergeCells, page spans)
sheet.layout.merge
experimental· untested
Column width / row height — set and reset, persisted, used by the page geometry
sheet.layout.sizes
experimental· untested
Cell fill / text colours are MINTED swatches — a raw hex in a colorRef paints nothing
sheet.lower.cell-colour-swatches
experimental· untested
Page-surface lowering — native <Table> + IR-v2 style map + measured column widths
sheet.lower.page
stable· 46 tests
Live multi-frame pagination across the host frame chain
sheet.lower.paginate
stable· 8 tests
Defined names — resolve on load, define / redefine / delete, place a name or table
sheet.names.define
experimental· untested
Formula dialect parser — literals, A1 refs, operator precedence, functions, union/intersection, array literals, defined names, canonical print fixpoint
sheet.parser.dialect
stable· 53 tests
paged.sheet bundle (media.paged.sheet) — manifest + activate + 3 panels + 7 commands + importer/exporter + engine boot
sheet.plugin.bundle
stable· 31 tests
Function browser + workbook inventory + the styleFromCell command (workbook panel)
sheet.plugin.function-browser
stable· 2 tests
Workbook persistence — host.blob (OPFS) + the metadata binding envelope
sheet.plugin.persistence
experimental· 2 tests
Workbook visual styles — xlsx parse -> deduped IR-v2 style table -> both surfaces (one resolver, cross-surface parity)
sheet.style.mapping
experimental· 4 tests
Excel structured tables / ListObjects — model + structured references + tableN.xml part
sheet.table.structured
stable· 8 tests
get_range_styled — the workbook's REAL per-cell visual styles, as a door of its own
sheet.wasm.range-styled-door
experimental· 1 test
Workbook structure — new blank workbook, add / rename / delete sheet
sheet.workbook.sheets
experimental· untested
Cell comments — preserve opaquely + display (grid indicator + panel list), preserve-first
sheet.xlsx.comments
stable· 2 tests
Conditional formatting — xlsx part fidelity + lowering to style overrides
sheet.xlsx.condfmt
stable· 8 tests
XLSX data validation — preserve byte-faithfully + read-only inventory (NEVER enforced)
sheet.xlsx.data-validation
stable· 2 tests
Pivot tables — preserve-only, NEVER interpreted (publishing-first non-goal)
sheet.xlsx.pivot
stable· 1 test
XLSX I/O on the fidelity ladder — preservation invariant + import/export through the platform
sheet.xlsx.roundtrip
stable· 101 tests

44 features · commit-pinned snapshot · the same rows the team plans by