更好的表格

Markown 的表格书写麻烦,而且是纯静态表格,一点灵活性都没有,但凡想在最后做个汇总,都得自己计算了写进去。倒是也可以用 Dataview 的行内查询,但是怎么获取同一列的相关数据呢?如果不能自动获取,修改数据之后,就不能自动更新计算结果了。

当然,有很多插件可以选择。但是我不想过度脱离 markdown 语法,也不想安装过多的插件,于是自己琢么出一个用 Dataview 来实现的小策略。

数据源

使用 Markdown 里面的列表来实现,这样便于 Dataview 进行查询(获取数据),而且列表格式和表格相近,即便直接阅读,可读性也是非常高的。

但是这个数据源不是用来我们日常阅读的,所以放在一个默认折叠的 Callouts 中,大概形式如下:

> [!source]- 数据源
> 
> - 小明 | 66 | 71 | 92
> - 小花 | 33 | 45 | 27

中间的分隔符我用了和表格一样的竖线,反正日常也不会使用这个符号,冲突的可能性不大,当然这里随便使用你自己喜欢的书写方法就好啦。

数据源放在最开始虽然难看一点点,但好处是不至于在查询的时候找不到数据(启动 Obsidian 之后第一次载入笔记可能发生这种情况)。

数据读取和解析

然后我们要书写一个 dataviewjs 代码段,不过这次我分开来讲哦,这个没法直接给代码啦,因为每个人、每一次的需求都不尽相同,所以自己修改是在所难免的。

/* 创建数组,用来保存表格数据 */
const data = []
/* 在当前文件中查询 */
dv.current()
  /* 文件中的所有列表(项) */
  .file.lists
  /* 如果有需要,可以进行过滤,比如通过所在快的标题进行筛选 */
  // .filter(item=>item.section==='小节标题')
  /* 遍历所有项目,简单处理并存储 */
  .forEach(item=>{
    data.push(item.text.split(/\s*\|\s*/g))
  })

这样并不复杂,我们就获得了所有的数据。

数据的处理与输出

接下来我们开始处理数据,拼接字符串。表格的表头没有放在源中,是为了保证源是纯粹的数据,好处理,好修改。

/* 开始准备拼接字符串 */
let tableCode = `| ID  | 姓名  | 数学 | 语文 | 英语 | 总分 |
| --- | --- | --- | --- | --- | --- |
`
/* 遍历数据,一般的一层循环就可以处理好 */
data.forEach((item, i)=>{
  /* 计算一下个人总分,此处根据需求修改 */
  let total = 0
  item.forEach((col, k) => k && (total+=Number(col)))
  /* 拼接表格代码 */
  tableCode += `| $String{(i+1).padStart(2,'0')} | ${item.join(' | ')} | ${total} |\n`
})
/* 如果有纵向汇总需求,比如单科平均成绩等,可以在下面增加计算代码 */
/* 比较简单的方法就是用 dv.span 进行输出,会自动渲染 markdown 代码 */
dv.span(tableCode)

效果

就可以获得大概长成这个样子的表格了:

ID 姓名 数学 语文 英语 总分
01 小明 66 71 92 229
02 小花 33 45 27 105

然后只需要修改源中的数据,这里的总分就会自动计算。其他情况以此类推即可。

©2022~2023 稻米鼠. Last build at 2023/12/5 00:00:21