Tolaria 电子表格文件格式完全指南:以 Markdown、YAML 与 CSV 存储可计算的工作表 Tolaria 电子表格文件格式完全指南以 Markdown、YAML 与 CSV 存储可计算的工作表【免费下载链接】tolariaDesktop app to manage markdown knowledge bases项目地址: https://gitcode.com/GitHub_Trending/to/tolariaTolaria 的电子表格Sheet笔记是一种独特的纯文本存储模型一个 Markdown 文件同时承载 YAML frontmatter 元数据与 CSV 风格的工作表正文配合_display: sheet显示标记与_sheet呈现元数据块让可计算的表格与知识库笔记在同一文件中和谐共存。本文围绕site/reference/spreadsheet-format.md的格式规范展开并结合仓库源码src/utils/sheetMetadata.ts、src/utils/sheetCsv.ts、src/utils/sheetWorkbook.ts等深入讲解文件结构、_sheet元数据字段、数字格式、Markdown 样式导入、跨表 Wikilink 引用以及面向 Agent/脚本的安全编辑规则帮助你在手工编辑、程序化生成或 AI 代理写回场景下准确理解并操作 Sheet 笔记文件。设计动机为什么工作表必须是一份纯文本 MarkdownTolaria 遵循文件系统为事实来源filesystem source of truth的设计原则相关决策记录见 ADR 0002Filesystem Source of Truth而 Sheet 节点的纯文本工作簿存储方案则由 ADR 0134Sheet Nodes With Plain Text Workbook Storage 固化下来。这意味着工作表不是隐藏在应用数据库或二进制 blob 里的私有数据而是一份可读、可 diff、可被 Git 跟踪、可被脚本和 AI Agent 直接编辑的普通文本文件笔记的type、status、tags、关系字段等语义元数据照常保留在 frontmatter 中与表格数据互不干扰表格呈现状态冻结行列、列宽、单元格样式以 YAML 形式存放在_sheet键下同样是明文而非不透明的序列化对象。Sheet 笔记的文件结构Sheet 笔记是带有 YAML frontmatter 和 CSV 风格正文的 Markdown 文件。当笔记的_display值为sheet时应用会以电子表格编辑器打开该笔记而type字段保持为普通语义元数据例如Project、Responsibility或其他任意 Tolaria 类型两者互不绑定。一个完整的 Sheet 文件示例--- type: Project _display: sheet tags: - planning _sheet: show_grid_lines: true frozen_rows: 1 frozen_columns: 1 columns: A: width: 180 rows: 1: height: 32 cells: E6: num_fmt: 0.00% bold: true --- Metric,January,February,March,Q1 Total Subscriptions,1200,1350,1500,SUM(B2:D2) Expenses,650,700,760,SUM(B3:D3) Net,B2-B3,C2-C3,D2-D3,SUM(B4:D4) Growth,,(C4-B4)/B4,(D4-C4)/C4,(E4-B4)/B4frontmatter 存元数据正文存行列单元格。文件中不存在 Markdown 表格包裹| ... |、fenced code block 或内嵌的二进制工作簿 blob。正文就是纯粹的 CSV 风格文本任何能解析 CSV 的工具都能直接读取表格数据。从源码层面看src/utils/sheetCsv.ts中的splitSheetDocument/mergeSheetDocument负责在---分隔线处把文件切分为 frontmatter 与 body 两部分src/utils/sheetWorkbook.ts的parseSheetRows会先做splitSheetDocument(content).body.trimEnd()再交给 CSV 解析器生成二维行数据。也就是说表格永远只存在于---之后的正文区。Frontmatter普通字段与系统字段的共存Sheet 笔记的 frontmatter 中所有普通 Tolaria 字段都照常可用typestatusdatetagsurl关系字段如belongs_to、related_to以及自定义 wikilink 属性在此基础上有两个与电子表格相关的专用字段_display: sheet是以表格显示的标记。省略它笔记就以普通文本笔记显示。_display属于 Tolaria 的下划线前缀系统字段约定见 src/utils/systemMetadata.ts其中将_display列入系统字段清单这类字段对普通属性编辑面板隐藏但可在原始源码raw source中查看与修改。_sheet是保留给电子表格呈现元数据的键遵循与其它下划线前缀系统字段相同的约定普通属性编辑界面中不可见但在 raw 模式下可见、可编辑。BodyCSV 文本的解析与序列化规则正文区遵循如下 CSV 规则行之间以换行符分隔单元格之间以逗号分隔包含逗号、引号或换行符的单元格需要用引号包裹被引号包裹的单元格内部的引号通过双写进行转义保存时末尾的空行与空列可以省略。这些规则在 src/utils/sheetCsv.ts 中有完整的双向实现解析端CsvRowParser逐字符扫描处理带引号状态consumeQuotedCharacter中→、\r\n/\n/\r三种行终止符序列化端shouldQuoteCsvCell在单元格包含,、、\n、\r或首尾存在空白差异value ! value.trim()时触发引号包裹serializeCsvCell通过value.replace(//g, )完成双写转义裁剪端lastMeaningfulRowIndex/lastMeaningfulColumnIndex从末尾向前定位最后一个非空行/非空列保存时自动丢弃尾部空白。公式的判别规则任何以开头的单元格输入都被视为公式其余单元格按字面值处理。这一判断在 src/utils/sheetMarkdownCell.ts 的parseSheetMarkdownCell中直接体现在第一行分支if (value.startsWith()) return { value, metadata: {} }——公式单元格不再参与任何 Markdown 样式解析。_sheet元数据表格呈现状态的纯 YAML 存储Tolaria 将表格呈现状态以纯 YAML 形式存放在_sheet键下。字段约定如下字段含义show_grid_lines是否显示网格线。frozen_rows顶部冻结的行数。frozen_columns左侧冻结的列数。columns.column.width自定义列宽以列字母为键如A或BC。rows.row.height自定义行高以从 1 开始的行号为键。cells.cell.num_fmt单元格的数字格式代码。cells.cell.bold粗体文字样式。cells.cell.italic斜体文字样式。cells.cell.underline下划线文字样式。cells.cell.strike删除线文字样式。cells.cell.font_size字号。cells.cell.font_color文字颜色。cells.cell.fill_color单元格填充颜色。cells.cell.horizontal_align水平对齐方式。cells.cell.vertical_align垂直对齐方式。cells.cell.wrap_text是否自动换行。cells.cell.border_top上边框样式。cells.cell.border_right右边框样式。cells.cell.border_bottom下边框样式。cells.cell.border_left左边框样式。单元格元数据以 A1 风格地址为键例如A1、B12、AA30。边框值存储为样式名 可选颜色的字符串例如border_bottom: thin #d0d7de源码级实现细节src/utils/sheetMetadata.ts 是这一格式的完整参考实现顶层设置show_grid_lines、frozen_rows、frozen_columns三个设置项在TOP_LEVEL_SHEET_SETTINGS中定义解析时frozen_*必须是非负整数show_grid_lines必须是布尔值否则忽略SHEET_SETTING_ASSIGNERS列/行元数据assignColumnMetadata要求width为数字且列名通过columnIndexFromName校验仅接受[A-Z]assignRowMetadata要求行键匹配^[1-9]\d*$单元格元数据CELL_SCALAR_METADATA_KEYS定义 11 个标量字段num_fmt、bold、italic、underline、strike、font_size、font_color、fill_color、horizontal_align、vertical_align、wrap_textCELL_BORDER_METADATA_KEYS定义 4 个边框字段normalizeCellAddress把地址统一为大写规范形式如e6→E6边框解析parseBorderMetadata按空白把字符串切分为[style, color]两部分无颜色时只保留 style序列化排序列按字母序号A、B、C…AA、AB…排序、行按数字升序、单元格按先行后列的行列序排序compareCellMetadataAddresses保证保存后的_sheet块输出稳定、易于 diff合并写回mergeSheetMetadata会先移除旧的_sheet块再按需插入新块若元数据为空isSheetMetadataEmpty则不写入任何_sheet内容。呈现默认值当_sheet未显式声明时src/utils/sheetWorkbook.ts 提供了一组默认值默认列宽125、默认行高28、默认字号13、默认字体颜色#000000、默认垂直对齐bottom、默认显示网格线true、默认冻结行/列数0。工作表的容量上限为 1,048,576 行 × 16,384 列对齐主流电子表格软件。数字格式Number Formats数字格式以电子表格风格格式代码存放在num_fmt中。常见示例格式输出示例#,##01,250#,##0.001,250.500.00%12.35%$#,##0.00$1,250.50yyyy-mm-dd2026-06-15这些格式只影响呈现不影响 CSV 正文中单元格的底层输入。例如0.00%只是把数值 0.1235 显示为12.35%正文中存储的仍是0.1235。在编辑器中使用右键菜单即可为选区应用数字格式格式化结果会以 YAML 形式写回_sheet.cells.cell.num_fmt参见 site/guides/use-spreadsheets.md。Markdown 样式导入当 Tolaria 导入一个非公式 CSV 单元格时简单的 Markdown 包裹符可以播种初始样式单元格文本存储值样式**Revenue**Revenuebold_Estimate_Estimateitalic***Total***Totalbold and italic~~Removed~~Removedstrike保存之后样式归属_sheet元数据正文只保留去掉包裹符的纯文本。src/utils/sheetMarkdownCell.ts 的parseSheetMarkdownCell按优先级依次识别***粗斜体、**粗体、__粗体、_斜体、*斜体、~~删除线。值得注意的是它对每个候选都额外校验去掉包裹符后剩余内容不以开头——公式永远不会被错误地套上样式包裹。Wikilinks单元格中的笔记链接与跨表引用普通单元格中的 Wikilink非公式单元格可以存放普通 Tolaria WikilinkAccount,Source Newsletter,[[newsletter-revenue]] Sponsors,[[sponsorship-pipeline]]未处于编辑状态时Tolaria 会把单元格里的 Wikilink 渲染为普通笔记链接进入单元格编辑后[[wikilink]]原始语法再次显示见 site/guides/use-spreadsheets.md。Command-点击单元格中的 Wikilink 可直接打开目标笔记。公式中的跨表引用公式单元格可以使用 Tolaria 的跨表语法引用另一张 Sheet 笔记[[newsletter-revenue]].B5 ROUND([[business-plan]].$E$12, 2) [[device]].power.watts [[launch-brief]].2跨表引用共分三类解析语义各不相同单元格引用[[sheet]].B5先按 Wikilink 目标解析另一张 Sheet 笔记再读取单个 A1 风格单元格支持$绝对标记如$E$12frontmatter 属性引用[[note]].property.path先按 Wikilink 目标解析一张笔记再读取点号后的标量属性路径如[[device]].power.watts数字行引用[[note]].2读取目标笔记去掉 frontmatter 后的第 2 条原始正文行保留其中的逗号作为文本整体。缺失、歧义、循环、过深或非标量的引用一律视为未解析并在表格中呈现为电子表格错误如#N/A。源码实现印证src/utils/sheetWorkbook.ts 完整实现了上述语义resolveExternalFormulaInput按三类正则SHEET_EXTERNAL_CELL_REFERENCE_PATTERN、SHEET_EXTERNAL_LINE_REFERENCE_PATTERN、SHEET_EXTERNAL_FRONTMATTER_REFERENCE_PATTERN把[[note]]...引用重写为 IronCalc 可求值的字面量或本地单元格引用替换前保留原始公式source替换后经 content bridge 在getCellContent层还原展示原始[[...]]语法避免用户看到被求值过的中间形态常量MAX_EXTERNAL_FORMULA_DEPTH 4限制了跨表依赖的嵌套深度对应规范中的very deep未解析条件resolvingPaths集合用于检测循环引用同一路径在解析栈中重复出现即判定为循环目标解析遵循 Tolaria 统一的 Wikilink 解析逻辑resolveEntry/wikilinkTarget支持路径后缀、别名与标题匹配见 src/utils/wikilink.ts跨表单元格引用目前只解析单个单元格范围公式如SUM([[other]].A1:A5)应留在同一张 Sheet 笔记内使用。更详细的公式语法、函数目录当前内置 IronCalc 引擎已实现 195 个函数与示例见 site/reference/spreadsheet-functions.md。面向 Agent 与脚本的编辑指南当以程序方式编辑 Sheet 笔记时请遵循以下原则保留 YAML frontmatter 分隔线与普通 Tolaria 字段文件需要以表格显示时保留_display: sheet把表格呈现状态保留在_sheet下将正文按 CSV 解析与序列化而不是手动按逗号切分将公式保留为公式包括[[sheet]].A1、[[note]].property.path和[[note]].1引用形式避免把公式转换成它们显示出来的值单元格包含逗号、引号或换行符时按 CSV 规则加引号包裹不要在一张笔记内添加多个工作簿标签页——如需多张表请创建另一张_display: sheet笔记不要把不透明的二进制工作簿状态写入 Markdown 文件。兜底策略如果脚本无法安全地保留_sheet块就应原样保留该块不动只编辑它能够理解的 CSV 正文单元格。这一策略与源码的存储模型天然契合正文与_sheet由splitSheetDocument/mergeSheetDocument与mergeSheetMetadata独立处理脚本完全可以只重写 body 而把 frontmatter 视作不透明内容。仓库的 demo vault 中提供了真实原型样例 demo-vault-v2/tolaria-sheet-prototype-sample.md 可供对照学习。相关文档使用电子表格操作指南创建 Sheet、输入公式、选区操作、格式化、Wikilink 与引用另一张笔记的交互流程电子表格公式函数参考公式语法、Tolaria 笔记引用形式、函数分类目录与示例ADR 0134Sheet 节点的纯文本工作簿存储该格式的设计决策记录。【免费下载链接】tolariaDesktop app to manage markdown knowledge bases项目地址: https://gitcode.com/GitHub_Trending/to/tolaria创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考