Tables

The core object — typed columns, calculated columns, formats, sorting and filtering, summary rows, validation, and styling.

A table is the core DreamSheets object: named, typed columns over rows of data, living as a card on the canvas. Create one with Insert → Table, by dragging a rectangle on empty canvas, or by importing a CSV / Excel file.

Columns and types

Every column has a storage type:

TypeHolds
TextStrings
NumberDecimal numbers
Whole numberIntegers
Yes/NoBooleans
DateCalendar dates
Date & timeTimestamps

Types are inferred on import and when pasting. Text and numbers sort themselves out as you edit: a text column whose values are all numbers becomes a number column, and a number column you type words into becomes text. To make a column Yes/No, Date or Date & time, use Display as… on its right-click menu. Columns can be renamed (F2 or double-click the header), hidden and re-shown, dragged to reorder, and resized by dragging the header edge — double-click the edge to fit the content.

Calculated columns

A calculated column's values come from a formula evaluated per row:

@Price * @Qty
LOOKUP(@SKU, Products.SKU, Products.Price)
PREVROW(Balance, 1000) + @Amount

Any column becomes calculated when you give it a formula, and plain again when you remove it. Insert column left/right opens the new header for its name; press Tab in any column header to go on to its formula (Shift+Tab moves to the previous header). Or open Edit column… on an existing column and type a formula — if the column holds typed values you're asked first, since the formula replaces them. Deleting a calc column's formula leaves an empty plain column. (Columns a table's SQL query produces can't take a formula; edit the query instead.) The formula editor gives autocomplete, syntax highlighting, and a dependency view.

Calc columns get a display format guessed from the formula — a column multiplying a currency by a percent comes out as currency; a date minus a date comes out as a plain number of days. Ambiguous combinations deliberately don't guess; set the format yourself.

A calc column's cells always equal the column formula — they can't hold individual overrides or manual edits, so what you see is always what the formula says.

Editing cells

  • Click and type — typing on a selected cell starts an edit immediately; Enter/F2 also work. Double-click for the classic route.
  • The Edit Cell panel (right dock) offers the full formula editor for single-cell formulas.
  • Per-cell formulas: an ordinary data cell can carry its own = formula, Excel-style — it wins over the stored value. Pasting text that starts with = asks whether you meant formulas. (Available on tables up to 1,000 rows; calc columns can't carry overrides at all.)
  • Cells can also hold media — paste or insert an image or video into a cell; a panel shows a preview, dimensions, and size, with replace/remove.
  • Per-cell formatting: the Edit Cell panel has a Formatting section — font, size, bold/italic/strikethrough, alignment, text overflow, and text/fill colour — applying to that one cell. It overrides the column's own formatting field by field, so a column set to Georgia/right-aligned stays that way except where a cell says otherwise. (Available on tables up to 1,000 rows, like every per-cell feature; format the column instead on bigger tables.)
  • Links: a cell whose value is a URL or an email address becomes clickable on its own — nothing to set up. For a link with its own label, right-click → Insert link… and give it text and an address; that writes a `HYPERLINK()` formula, so the cell's value stays the plain label that sorts, filters and exports. Click the link text to open it in your browser; Ctrl+click the cell to edit it. Only web, mailto: and tel: addresses open.
  • Cell edits are keyed to the row's identity, so sorting or inserting rows never misplaces an edit.

Sorting and filtering

  • Sort from the column menu — ascending or descending, calc columns included. Sorting physically reorders rows (undoably).
  • Filter in place from the column menu — the choices follow the column's type. Every column has is one of… (a checklist of its distinct values), is empty, and is not empty; a number column adds is not and numeric comparisons; a text column adds is, is not, contains, starts with, and ends with (the last three ignore case); a date column adds is on, is before, is after, and is between, each with a date picker. Filters are display-only: hidden rows still feed formulas, summary rows, and charts, so your totals never silently change because of a filter.

Saved filters

Once a filter or sort is active, the table's card menu offers Save filter as… — name the current combination of per-column filters and sort, and it becomes a saved view on that table. Saved filters on the same menu re-applies any view as a single undoable step (every column's filter is set, columns not in the view are cleared, and the sort re-runs; ● marks the view matching what's on screen now), and holds Clear filters and Delete saved filter. Views follow the columns themselves, so renaming a column doesn't break them.

Rows, columns, and structure

Right-click menus cover: insert row above/below (or insert multiple), insert column left/right, rename, hide, delete row/column, clear formatting, fill and text color, and per-column features described below. The Edit Table panel has live row/column count fields — type a number to grow or shrink the table (with a confirmation before destroying data).

Bulk clean-ups — UPPERCASE / lowercase, trim spaces, fill blanks, split by delimiter, remove duplicate rows — live under Transform… on the column header's right-click menu, batched across a multi-column selection so "trim these four" is one op and one undo. See Cleaning & reshaping data.

Summary rows

Pinned footer rows that aggregate the table: quick picks for Total, Average, Count, Min, Max, or any custom formula per cell (each cell of a summary row is independently formula-bound, or blank). Rename and delete from the row's menu. Because filters are display-only, summaries always reflect the full data.

Display formats

A format controls presentation, not storage:

FormatOptions
Plain text—
Numberdecimals, thousands separators, compact (2.8M)
Currencysymbol, decimals, compact
Percentdecimals (stored as a fraction: 8% is 0.08)
Datepreset date/time styles
Yes / Nocustom true/false labels

Formats resolve per column → table default → document default (View → Default Format…), most specific wins.

Styling and conditional formatting

  • Column style: font family/size, bold, italic, underline, strikethrough, alignment, and text overflow.
  • Text overflow — how a value too wide for its column is shown: Truncate (an ellipsis, the default), Wrap (flows onto more lines and grows the row), or Shrink to fit (the font scales down until it fits, staying on one line). Set it per column, per cell, per table, or document-wide; the most specific wins.
  • Fill and text color per column, plus manual per-cell colors.
  • Conditional formatting per column: threshold rules (greater than, less than, between, equal to, text contains — first match wins), Formula is true — style the rows where a formula like AND(@Status = "open", @Due < TODAY()) holds, reading any column in the table, not just the one the rule lives on — plus color scales (min→max gradient) and data bars (in-cell proportional bars).
  • A rule added over a multi-column selection (or copied to more columns with the rule's apply button) stays linked: edit it once and every linked copy follows. Removing it from a column unlinks just that column, leaving the rest of the group intact.
  • Gridlines can be hidden per table (vertical, horizontal, or both).
  • Row height and font size per table, with document defaults; by default text scales with the row height.

Data validation

A column can restrict entry to a dropdown list of options. With enforce on, the restriction is enforced at the data layer — paste, scripts, plugins, and AI actions can't write an out-of-list value either (blank is always allowed). Enabling validation on an existing column can seed the option list from its current distinct values.

A date-formatted column can instead turn on Calendar-Style-Date Picker (same section): each cell gets a 📅 that opens a small calendar. Typing a date still works, and nothing is enforced.

Options are added one at a time in a single field: type one and press Enter, and it moves into the list below as a chip (click its × to remove it). An entry can be plain text (Yes) or a column (Lists.Region, a bare Column for this table, or Ctrl+click a column on the canvas), optionally narrowed to a row range (Lists.Region[2:20]). The field colors the entry by which one it is. Nothing is copied from a column: the menu reads it live, so adding a value there adds it to every dropdown pointing at it. Mix freely: several columns, and extra text options alongside them. Text that happens to match a column name is treated as the column. Put it in double quotes ("Region") to keep it as text.

Linked columns

Add column from another table… pulls a column in from another table, matched either by position or by key (choose the local and foreign key columns — a real join). Linked columns are read-only and refresh on demand via Refresh linked columns. For multi-column joins or aggregation, reach for a query table instead.

Card display modes

How a table card uses its canvas space:

  • Auto expand (default) — the card covers its data: it sizes itself to every column and every row, so adding data grows the card. Past a height cap the extra rows collapse behind a "… more rows" band. Dragging an edge takes over manually and switches the table to Custom.
  • Full Table — sized to the whole table when you pick it; renders as many rows as fit (up to a cap). Dragging switches to Custom.
  • Custom — the card is exactly the size you gave it. Extra rows collapse behind a "… more rows" band, and dragging an edge inserts or deletes rows/columns to match.

Size to Fit

Size to Fit (Alt+Shift+F, or the card's header menu) snaps a card to its content:

  • Table and Columns (Alt+Shift+F) — widens every truncated column to fit its header and cells (capped), then sizes the card horizontally so it ends exactly on the last column that carries data. Trailing empty columns are clipped off the edge, not deleted.
  • Table Only (Alt+Shift+T) — the same card resize, leaving the column widths alone.
  • Columns Only (Alt+Shift+C) — the column widths, leaving the card alone.

Vertically the fit only ever shrinks: the card comes down to the rows that carry data, dropping the blank ones the windowed modes pad it with. It never grows — revealing rows the window is hiding is what the display modes above are for, and a "fit" that grew would undo a deliberately small card. On a column header, Size to fit does the one column (or every selected one) — which is also what Alt+Shift+F and Alt+Shift+C do while a header selection is what you have. On a tile the submenu offers Width and Height (Alt+Shift+F), Width Only (Alt+Shift+W), or Height Only (Alt+Shift+H), sizing the card so its value and description fit with no scrollbar.

Very large tables

Tables past ~10,000 rows render a windowed "peek" for speed; full-data operations — filters, aggregates, SQL, find — always run over the complete data in the backend.

Some tables go a tier further and don't load into memory at all. They land as a read-only Big table — the rows travel as parquet inside the .dsheet file, so the document stays portable and opens offline. Three things land there: an external query result over 100,000 rows; a CSV too large for this machine's memory (the line is a share of your RAM, not a row count, so the same file can be editable on one machine and read-only on another); and a table in a document you open that no longer fits, which is named in a notice when it happens. You can also put a table there on purpose — Make read-only dataset… on the table menu. A Live table goes further still and leaves the rows in the source database entirely, pushing reads (the visible window, charts, filters, distinct values, find) down to it.

A dataset is read-only, not inert: charts, filter tiles, filter in place, search, sorting, number formats and scripts all still work on the full data. What stops is editing cells, calculated columns, per-cell formulas and summary rows — and formulas elsewhere read a dataset as empty, so SUM() over one answers 0 rather than erroring; don't point a formula at a dataset. To work with the data, filter or aggregate it into a smaller table: Load subset… on the table menu opens a query prefilled to narrow it down to a result that lands as an ordinary, fully editable table. Make editable brings a Big table back whole when this machine has room for it — and tells you its size when it doesn't. Setting up connections is covered in import & export.

The table menu

The card's header menu collects table-level operations: inspect, rename, Ask AI about this table…, connectors, Table View Mode, Size to Fit (above), gridlines, add summary row, show hidden columns, Save filter as… / Saved filters (above), Create chart from table…, the reshape verbs — Summarize…, Combine with another table…, and Reshape ▸ (pivot / unpivot — see Cleaning & reshaping data) — Query Table…, create or edit an attached script, add column from another table, refresh linked columns / refresh query, Load subset… (Big and Live tables), Export… (every export format), and delete.

Descriptions

Tables, columns, cells, tiles, charts, and scripts can all carry a free-text description. A table or chart shows its own as a strip on the card — edit it in place, drag its bottom edge to expand it, or switch it to a hover tooltip; columns and cells take theirs in their editor panels, marked by a dot on the header or cell and shown on hover. Descriptions are more than notes: the Excel importer records provenance in them (a column it kept static carries the original Excel formula), and AI-assisted transforms read them and describe what they create.