使用场景
数据表格适用于结构化数据的浏览和检索场景,是三层模板中最基础、最通用的一层。
| 场景 |
说明 |
典型数据量 |
| 文件索引 |
文档/图片/代码文件的目录清单,含路径、大小、日期 |
10-500 行 |
| 收藏管理 |
来自各平台的书签、收藏、笔记汇总表格 |
10-200 行 |
| 项目列表 |
多项目概览(名称、状态、Star 数、最后提交日期) |
5-50 行 |
| 数据浏览 |
JSON/CSV 的快速预览,替代电子表格 |
10-1000 行 |
| 审计日志 |
操作记录、版本变更、事件追踪 |
50-10000 行 |
不适合的场景
- 长文本阅读(>200 字/字段 → 用 B 型文档)
- 多类目知识库(需要标签切换 → 用 C 型知识库)
- 图表/可视化(数据表格不提供绘图功能)
方案设计
架构
Layer 1: style-guide.css (CSS 变量 + 组件基座)
Layer 2: layout-table.html (模板骨架)
Layer 3: html-gen.py → table 子命令 (数据注入)
数据流
JSON 文件 ──→ html-gen table ──→ 单文件 HTML
│ ├── 搜索
│ ├── 排序
│ └── 分页
└── 列定义自动推导
关键设计决策
| 决策 |
选择 |
理由 |
| 数据格式 |
JSON 原生 |
CLI 工具链天然适配,可直接从 API/脚本输出 |
| 列定义 |
自动推导 |
减少配置文件,第一个 record 的 keys 即为列名 |
| 排序 |
客户端 JS |
无需后端,数据量 10K 以内表现良好 |
| 分页 |
客户端 JS |
每页 30 条,自动计算页数 |
| 搜索 |
客户端 JS |
实时过滤,按任意字段匹配 |
| 样式 |
style-guide.css inline |
零外部依赖,单文件嵌入 |
移动端响应
表格在屏幕宽度 <768px 时启用横向滚动,列头固定。移动端隐藏非关键列(摘要模式)。
行业对标
| 维度 |
A 型 · 数据表格 |
Airtable |
Notion 表格 |
Excel Online |
| 定位 |
文件级数据展示 |
协作数据库 |
团队知识库 |
电子表格 |
| 部署 |
单文件 HTML |
SaaS |
SaaS |
SaaS |
| 数据源 |
本地 JSON |
内置数据库 |
内置数据库 |
云端文件 |
| 搜索 |
✅ 实时 |
✅ 实时 |
✅ 实时 |
✅ 查找 |
| 排序 |
✅ 多字段 |
✅ 多字段 |
✅ 多字段 |
✅ 多字段 |
| 分页 |
✅ 客户端 |
✅ 虚拟滚动 |
✅ 虚拟滚动 |
❌ 无分页 |
| 离线 |
✅ 完整 |
❌ 需要网络 |
❌ 需要网络 |
✅ 桌面版 |
| 依赖 |
零外部依赖 |
需要 JS 框架 |
需要 JS 框架 |
浏览器 |
| 文件大小 |
~13KB |
N/A |
N/A |
N/A |
核心差异:A 型追求极简和零依赖,适合作为 CI/CD 产物、静态站点的一部分或临时数据查看工具。不是 Notion/Airtable 的替代品,而是在「需要快速展示结构化数据」场景下的轻量级补充。
功能清单
已实现 ✅
| 功能 |
说明 |
优先级 |
| JSON 数据注入 |
从 JSON 文件读取,自动推导列名 |
P0 |
| 实时搜索 |
按任意字段全文匹配,输入即过滤 |
P0 |
| 多字段排序 |
点击表头切换升/降序,支持多重排序 |
P0 |
| 客户端分页 |
每页 30 条,自动计算总页数和条目数 |
P0 |
| 深色主题 |
与 style-guide.css 一致的 surface-950 深色背景 |
P0 |
| 搜索无结果提示 |
搜索不到内容时显示 "没有匹配项" |
P0 |
| 显示 N/M 计数 |
工具栏显示 "显示 X / Y 条" |
P0 |
| 列自动宽度 |
表头固定,内容自适应 |
P0 |
| 零外部依赖 |
单文件 HTML,无需加载 CDN 脚本 |
P0 |
| 序号列 (showIndex) |
OPTIONS.showIndex 渲染首列序号,Cinema 模型 42px 显式宽度 |
P0 |
| 整行详情字段 (splitFull) |
字段在分栏详情占整行宽,\n→
段落渲染(原文/白话/历任皇帝) |
P0 |
| 默认筛选 (defaultFilter) |
options.defaultFilter {key,value} 加载后自动筛选(大明时间轴默认嘉靖) |
P0 |
| pills 列整格 split |
标签列整格点击开分栏,pill 点击筛选 stopPropagation 共存 |
P0 |
| 行高统一 |
td 7px 8px + cell-pill vertical-align:middle → 全类型表 34-35px |
P0 |
| 列隐藏 (initialHidden/hide) |
默认隐藏列(设置面板可开);永不可见列 |
P1 |
| 列冻结 / 右侧固定 |
col.freeze sticky 左列;col.stickyRight 视口右侧固定 |
P1 |
| 分栏模式列过滤 |
col.preview 仅预览列显示于分栏;options.columnsSplit 指定列集 |
P1 |
| 视图预设 |
保存/加载/删除设置(密度/模式/排序/列可见性,≤2KB×10) |
P1 |
| 操作按钮列 |
actions 列:copyKey/hrefKey/desc/handler 四种按钮 |
P1 |
| 多标签页 |
TABS 定义标签切换 + count |
P1 |
| CSV 导出 / 批量操作 |
exportCSV / rowSelect 工具栏(全选/取消/导出) |
P2 |
| 列宽拖拽记忆 |
拖拽 resize 直接操作 DOM,localStorage 持久化 (html-gen:table:col-widths) |
P2 |
| 快捷搜索 (Cmd+F) |
Spotlight 弹窗搜索 (150ms debounce) |
P2 |
| 密度切换 / 设置面板 |
紧凑/标准/舒适 + ⚙️ 下拉(列可见性/视图预设) |
P2 |
待实现 🔜
| 功能 |
说明 |
优先级 |
| 批量选择 |
多行勾选,支持批量复制/删除 |
P1 |
| 行详情面板 |
点击行展开详情侧栏,展示完整字段 |
P1 |
| 导出 CSV |
一键导出当前筛选结果 |
P2 |
| 自定义筛选 |
按指定字段 + 操作符(= / != / contains)组合过滤 |
P2 |
| 列拖拽调整 |
拖拽表头调整列宽和列顺序 |
P3 |
| 单元格编辑 |
双击单元格直接编辑值,支持 JSON 写回 |
P3 |
| 多数据源切换 |
页面内切换不同 JSON 数据集 |
P3 |
| 键盘导航 |
↑↓ 选行,Enter 展开详情 |
P3 |
快速开始
# 准备数据
cat data.json
# 生成表格
html-gen table -d data.json -o index.html
# 在浏览器打开
open index.html
数据格式
[
{
"项目": "Hermes Agent",
"Star": 50200,
"语言": "Python",
"最后提交": "2026-07-06"
}
]
命令行参数
html-gen table -h
-d, --data PATH JSON 数据文件(必需)
--title TEXT 页面标题(默认: "数据表格")
-o, --output FILE 输出 HTML 路径(默认: index.html)
迭代记录
| 版本 |
日期 |
变更 |
| v1.0 |
2026-07-01 |
初版:JSON 注入 + 搜索 + 排序 + 分页 |
| v1.1 |
2026-07-06 |
列自动推导(移除 cols.json)、搜索无结果提示 |
| v2.0 |
2026-07-22 |
结构化格式:columns/tabs/options;操作按钮列、多标签、CSV 导出、列可见性、列宽拖拽 |
| v2.1 |
2026-08-18 |
行高统一 34-35px;showIndex 序号列;splitFull 整行字段;defaultFilter 默认筛选;pills 列整格 split |
| v2.2 |
2026-08-19 |
36计/时间轴重构列模型;视图预设;设置面板;列冻结/右侧固定;分栏列过滤 |