root (usually a List or Dictionary)
├── cell → scalar | formula string | structure | checkbox | file
│ ├── Grid { rows, cols, cells{} }
│ ├── Table { headers, fieldAxis, colFormula|rowFormula, colStruct*|rowStruct*, … }
│ ├── List { indexes 1…n, cells{}, indexKind: "unnamed" }
│ ├── Dictionary { indexes as field names, cells{}, indexKind: "named" } // same shape as list
│ └── Pivot { sourceId, groupBy, values, filters, … }
└── names: defined name → { structure id, r, c }
- Runtime links use
__id + __parent. Parents are stripped on export; ids stay so names resolve.
- Cells are sparse maps — missing key means empty.
- Filters change visibility only. Calculation still walks full data rows.
- Formulas store names (headers, indexes, paths), not opaque pointers. Rename rewrites those names in place.
- The top-bar path is the parent chain as a dotted directory (
Workbook.School.Teachers.'Full Name'.2). The root name is the file name — not Workbook.Sheet.…. Numeric field names are quoted ('12'.12) so they are not mistaken for record numbers. Apostrophes in a name are doubled. Esc walks up. Space walks down.
- Structure chrome (headers, gutters) mutates shape; data cells only hold values. See Structure types.