在Org-mode表格中永久求和一列

110
在Emacs Org-mode表格中,如果你有一列整数,可以使用C-c +然后C-y来粘贴该列值的总和。我想知道在最后一行中放置的公式以始终对整个列求和。
我已经尝试了所有方法。文档向您展示如何将两列相加,但没有单独对一列进行求和。

7
我能做到的最好的是在表格顶部和底部添加一条高线,并使用列公式:=vsum(@I..@II)。 - Mauvis Ledford
顺便提一下,我刚刚在这里发布了一个关于hline定位的类似问题:https://dev59.com/s1nUa4cB1Zd3GeqPYTnG这个问题已经得到了投票,并且答案可能会有所不同,所以我暂时会保留它。 - Mauvis Ledford
对于那些想知道的人,当光标位于 #+TBLFM: 行时,请使用 C-c C-c 来执行答案中给出的公式。 - legends2k
6个回答

77

一个表格的最后一行是@>

例如,要获取最后一行第三列的总和,可以使用以下公式

@>$3=vsum(@2..@-1)

如果你没有标题行,也许需要调整@2...


72

使用^符号分配一个字段名称:

|---+---|
|   | 1 |
|   | 2 |
|   | 3 |
|---+---|
|   | 6 |
| ^ | x |
|---+---|
#+TBLFM: $x=vsum(@1..@-1)

请参见The Org Manual第3.5.9节高级功能


谢谢!这最终效果还不错,我很满意。但是,现在我有一个具有相同内容的“页眉”hline和“页脚”hline。是否有一种方法只使用“页眉”hline 实现这个?在文档中,它是“-”标记,但我不知道如何使用vsum(@2..@[last item])。 - Mauvis Ledford
5
你可以使用 #+TBLFM: @row$col=vsum(@1..@-1) 这段代码。 - mgalgs
11
我收到了“未知字段:x”的信息。 - incandescentman
我也遇到了未知字段。请阅读手册,基本上在上面的例子中它调用了 ^ x x 上面的行,因此 6 是从 1、2、3 的 vsum 计算得出的。 - Japhir
1
请注意,^ 应该在表格的第一列,而不仅仅是您想要求和的列之前的列。 - Dr. S

64

另一种可能性是利用水平线(@I, @II等),这些线在任何情况下都对表格结构非常有用:

| What  |    $$ |
|-------+-------|
| Ice   |  3.00 |
| Soda  |  6.49 |
| Gin   |  4.99 |
|-------+-------|
| Total | 14.48 |
#+TBLFM: @>$2=vsum(@I..@II)

按照其他人的建议,不需要标题,直接让总和从@0开始。

编辑:我刚刚看到你已经在问题的评论中自己写过这个了。


2
我花了一分钟才明白@I和@II是指水平线,但如果您以这种方式组织表格,我认为这是最简单的方法。 - trey-jones
我应该使用哪个按键绑定来设置求和结果? - alper
在 TBLFM 行上,使用 C-c C-c 并将光标放在公式上对我有效。 - Winny

15
你可以尝试这样做: $=(@2..@-1))
@2是固定的。它指的是从第二行开始。 @-1指的是倒数第二行。
我认为这是最简单和不会影响其他部分的方法。它保留了您的列名,并且不会使视觉空间混乱。它无需让您处理最后一行,因为它默认被处理了。
行可以添加/删除。 没有其他标记。
例如。 #+TBLFM: $3=vmean(@2..@-1)::$4=vsum(@2..@-1))
样本表格
   | Time                   | Input             | Test      | InQty |
   | <2018-03-13 Tue 06:15> | Water             |           |   200 |
   | <2018-03-13 Tue 07:03> |                   |           |       |
   |                        |                   |           |       |
   | <2018-03-13 Tue 07:31> | Water             |           |   180 |
   | <2018-03-13 Tue 09:00> | Chai              |           |   240 |
   | <2018-03-13 Tue 11:30> | Chai              |           |   240 |
   | <2018-03-13 Tue 16:01> | Water             |           |    60 |
   |                        |                   |           |       |
   |------------------------+-------------------+-----------+-------|
   |                        |                   |           |   920 |
   #+TBLFM: $4=vsum(@2..@-1)

3

读者可能看不出来的是,函数是vsum()而不是sum()

另一件事是,@2..@-1是对正在汇总的列的行特定标签的引用。在Excel中,$A$1类似于@1$1,因此对vsum(@2..@-1)的引用表示“对该列的值求和,使用范围为第二行到倒数第二行(即倒数第二个)的@值作为行索引,但此时列已经确定,所以它是应用于[@2$col @3$col @4$col... @-1$col]的vsum,如果您尝试将这些概念映射到Excel中,就会明白了。


0
|  3 |
|  2 |
|  5 |
| 10 |
#+TBLFM: @4$1=vsum(@1..@-1)

@1 指第一行,@-1 指公式所在行的前一行。该公式忽略水平线:

|  3 |
|  2 |
|  5 |
|----|
| 10 |
#+TBLFM: @4$1=vsum(@1..@-1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接