从坐标系与稀疏矩阵起步,不引一个第三方库、不抄一行别人的实现,一个里程碑一个里程碑地砌——五层架构、六条硬约束,撑起一整套电子表格。Starting from a coordinate system and a sparse matrix, without a single third-party library or a borrowed line — milestone by milestone. Five layers, six hard invariants, one complete spreadsheet.
数据模型(零 DOM,可 Node 单测):Workbook / Worksheet / Cell / Range / Style / SparseMatrix / SelectionModel / EditCommands(快照命令撤销)/ Clipboard / FillEngine / find / sort / validation。Data model (DOM-free, unit-testable in Node): Workbook / Worksheet / Cell / Range / Style / SparseMatrix / SelectionModel / EditCommands (snapshot-command undo) / Clipboard / FillEngine / find / sort / validation.
公式引擎(纯逻辑):Tokenizer → Parser(Pratt) → Evaluator → DependencyGraph(三色环)→ FormulaEngine;272 内置函数分数学/财务/统计/数据库/文本/引用族;QM/QC/JE/FS/REF 报表取数。Formula engine (pure logic): Tokenizer → Pratt Parser → Evaluator → DependencyGraph (3-color cycle) → FormulaEngine; 272 built-ins across math/finance/stats/database/text/ref; QM/QC/JE/FS/REF report fetches.
画布渲染 + 交互(面向最小 RenderContext2D,可 mock 测):SheetGeometry(getCellRect/hitTest)· PaneLayout(冻结/尾冻结/拆分 3-band)· Viewport · SheetRenderer · CellEditor · condFormat · numFmt · drawChart/drawSparkline。Canvas render + interaction (against a minimal RenderContext2D, mockable): SheetGeometry (getCellRect/hitTest) · PaneLayout (freeze/trailing/split 3-band) · Viewport · SheetRenderer · CellEditor · condFormat · numFmt · drawChart/drawSparkline.
导入导出(零依赖):snapshot(中性 JSON)· xlsx · csv · ssjson · zip/deflate/inflate · exportHtml/exportPdf/paginate。Import/export (zero-dep): snapshot (neutral JSON) · xlsx · csv · ssjson · zip/deflate/inflate · exportHtml/exportPdf/paginate.
<cmx-megasheet> 自定义元素 + ReportModel 输入契约。组件边界 = 公式栏 + 画布 + 页签栏 + 主题(工具栏留宿主)。约 150 个公共方法。The <cmx-megasheet> custom element + ReportModel input contract. Component boundary = formula bar + canvas + tab bar + theme (toolbar left to the host). ~150 public methods.
统一出口:既可作 <cmx-megasheet> 元素用,也可作库 import { Workbook, FormulaEngine } 用。A single entry: use as the <cmx-megasheet> element, or as a library via import { Workbook, FormulaEngine }.
designer.js/report-applier.js 一个字节没动就换了内核。The public facade is a contract; hosts swapped kernels without a byte changed.dependencies: {}——ZIP/DEFLATE/XLSX/PDF/图表/公式全自研。dependencies: {} — ZIP/DEFLATE/XLSX/PDF/charts/formula all in-house.getCellRect 与 hitTest 严格互逆,跨冻结/拆分/滚动/缩放恒成立。getCellRect and hitTest are strict inverses across freeze/split/scroll/zoom.A1 语法:相对/绝对 $、跨表 Sheet1!A1、整列 A:A、整行 1:1、数组字面量 {1,2;3,4}、命名区域。依赖图拓扑重算 + 三色标记环检测(#CIRC!)+ 增量重算。A1 syntax: relative/absolute $, cross-sheet Sheet1!A1, whole column A:A, whole row 1:1, array literals {1,2;3,4}, named ranges. Topological recalc + 3-color cycle detection (#CIRC!) + incremental recalc.
SIN COS LN LOG PI FACT COMBIN CEILING.MATH BASE ROMANPMT FV PV NPV IRR XIRR MIRR SLN SYD DDB EFFECTVLOOKUP HLOOKUP INDEX MATCH XLOOKUP ADDRESS INDIRECTDSUM DGET DCOUNT DAVERAGE| 格式 | Format | 说明 | Notes |
|---|---|---|---|
| JSON | format:"cmx-megasheet",稀疏、不含视图态,单一事实源format:"cmx-megasheet", sparse, view-free, single source of truth | ||
| XLSX | 零依赖 ZIP+DEFLATE;值/公式/样式/合并/尺寸/多表/冻结/筛选/验证全保真(openpyxl 互通)Zero-dep ZIP+DEFLATE; values/formulas/styles/merges/sizes/sheets/freeze/filter/validation fully preserved (openpyxl-interop) | ||
| CSV | RFC-4180 引号转义,分隔符可选(, ; \t),可选 BOMRFC-4180 quote escaping, selectable delimiter (, ; \t), optional BOM | ||
| SSJSON | 读历史工作簿,平滑迁移入中性快照Reads legacy workbooks, migrates smoothly into the neutral snapshot | ||
| HTML/PDF | HTML 带条件格式底色;零依赖手写 PDF(真浏览器可解析)HTML with conditional-format shading; zero-dep handwritten PDF (real browsers parse it) |
每个里程碑都有一个真机可运行的演示页。Every milestone has a real, runnable demo page.
| M | 能力 | Capability | 要点 | Highlights |
|---|