1. 程式人生 > >用lisp在emacs org table中進行電子表格計算

用lisp在emacs org table中進行電子表格計算

一句話,計算方面絕對比excel計算功能強。圖形方面我還沒有用過。對於程式設計者來講,用滑鼠拖拽操作還是用lisp編寫計算公式哪個更符合思考的習慣,我覺得是後者。我這裡只介紹lisp計算公式,如果關注簡單的Calc計算公式,可以參考官方文件

如何引用表格中其他欄位

推薦寫法,@row_index$col_index

可以用C-c } 顯示或者隱藏row_index和col_index

比如:


如何插入公式

首先將游標定位到要計算的cell,然後可以通過選單,tbl->calculat->set column formular, 也可以使用組合鍵: C-u C-c =

然後在mini buffer中輸入公式,回車。結果會在表格下面出現公式:

* 測試表格

#+CAPTION: DAU統計
| 日期   | 新增  | 日活  | VV    |
|--------+-------+-------+-------|
| <6>    | <l5>  | <l5>  | <l5>  |
| /      | <     | >     |       |
| 2015-05-01 | 10    | 20    | 51    |
| 2015-05-04 | 11    | 22    | 68    |
|        |       |       |  119  |
#+TBLFM: @6$4='(+ @4$4 @5$4);N

注意,這裡採用了lisp計算公式,前面要用單引號防止過早求值,後面需要加上;N,據說是N模式,我目前還不是很理解這個模式。

如何重新計算

C-u C-c * 可以對整個表格重新計算(游標必須停留在表格上), 結果如下:

#+CAPTION: DAU統計
| 日期   | 新增  | 日活  | VV    |
|--------+-------+-------+-------|
| <6>    | <l5>  | <l5>  | <l5>  |
| /      | <     | >     |       |
| 2015-05-01 | 10    | 20    | 50    |
| 2015-05-04 | 11    | 22    | 68    |
|        |       |       | 118   |
#+TBLFM: @6$4='(+ @4$4 @5$4);N


如何對某列求和

有一種不需要編寫公式就可以對某列求和的方式,將游標定位到某個cell,然後按下C-c + ,就會看到mini buffer的提示,然後按下S-Insert 鍵,就自動出現了求和的值。比如:

#+CAPTION: DAU統計
| 日期   | 新增  | 日活  | VV    |
|--------+-------+-------+-------|
| <6>    | <l5>  | <l5>  | <l5>  |
| /      | <     | >     |       |
| 2015-05-01 | 10    | 20    | 50    |
| 2015-05-04 | 11    | 22    | 68    |
|        |     21  |   42    |    118   |

但是我還是覺得用lisp公式比較好,便於維護,因為一旦資料發生了變動,只需要重新計算一次表格即可。

#+CAPTION: DAU統計
| 日期   | 新增  | 日活  | VV    |
|--------+-------+-------+-------|
| <6>    | <l5>  | <l5>  | <l5>  |
| /      | <     | >     |       |
| 2015-05-01 | 10    | 20    | 49    |
| 2015-05-04 | 11    | 22    | 68    |
|        | 21    | 42    | 117   |
#+TBLFM: @6$2='(+ @[email protected]$2);N::@6$3='(+ @[email protected]$3);N::@6$4='(+ @[email protected]$4);N

首先,這裡有三個計算公式,中間使用::分隔開來

然後引用範圍的fields值可以用..表示from..to的語義。

最後,每次修改任何一個值,直接重新計算該表即可。這個方式比較好。


上面的公式還可以優化,可以使用相對位置指定最後一行:

#+CAPTION: DAU統計
|   日期 | 新增  | 日活  | VV    | 轉化率 |
|--------+-------+-------+-------+--------|
|    <6> | <l5>  | <l5>  | <l5>  |        |
|      / | <     | >     |       |        |
| 2015-05-01 | 11    | 20    | 42    |        |
| 2015-05-04 | 12    | 20    | 61    |        |
| 2015-05-05 | 19    | 19    | 80    |        |
|        | 42    | 59    | 183   |        |
#+TBLFM: @7$2='(+ @[email protected]$2);N::@7$3='(+ @[email protected]$3);N::@7$4='(+ @[email protected]$4);N

-1 表示在@7的前一行,因此可以在中間插入任意多行,公式只需要修改@7為正確行數,就能夠正確計算。

除法

elisp的除法就是/, 當出線浮點數就作為浮點除法,如果都是整數,就整除。

#+CAPTION: DAU統計
|   日期 | 新增 | 日活 |    VV |             轉化率 |
|--------+------+------+-------+--------------------|
|    <6> |      |      |       |                    |
|      / |    < |    > |       |                    |
| 2015-05-01 |   11 |   20 |    42 |                    |
| 2015-05-04 |   11 |   20 |    41 |                    |
| 2015-05-05 |   22 |   40 |    84 |                    |
| 2015-05-06 |   41 |   81 |  68.0 |                    |
|    All |   85 |  161 | 235.0 | 1.4596273291925466 |
#+TBLFM: @8$2='(+ @[email protected]$2);N::@8$3='(+ @[email protected]$3);N::@8$4='(+ @[email protected]$4);N::@8$5='(/ @8$4 @8$3);N


現在開始計算每一行的轉化率:

#+CAPTION: DAU統計
|   日期 | 新增 |  日活 |    VV |             轉化率 |
|--------+------+-------+-------+--------------------|
|    <6> |      |       |       |                    |
|      / |    < |     > |       |                    |
| 2015-05-01 |   11 |    20 |  42.0 |                2.1 |
| 2015-05-04 |   12 |    20 |    41 |                  2 |
| 2015-05-05 |   22 |  41.0 |  79.0 | 1.9268292682926829 |
| 2015-05-06 |   41 |    81 |  68.0 | 0.8395061728395061 |
|    All |   86 | 162.0 | 230.0 | 1.4197530864197532 |
#+TBLFM: @4$5='(/ $4 $3);N::@5$5='(/ $4 $3);N::@6$5='(/ $4 $3);N::@7$5='(/ $4 $3);N::@8$2='(+ @[email protected]$2);N::@8$3='(+ @[email protected]$3);N::@8$4='(+ @[email protected]$4);N::@8$5='(/ $4 $3);N


注意,這裡寫法再次優化:

每個公式都有當前行的概念,比如

@4$5='(/ $4 $3);N
由於@4已經指定了當前行數,所以後面$4和$3就不需要指定行號,直接用當前行即可。

管理多個公式

公式一旦多起來,就需要工具幫忙管理。org tablei已經提供了。將游標停留在某個有公式的欄位,然後按C-c ' ,就會出現新的buffer。C-u C-c C-c是安裝公式。



移動右邊buffer的游標,左邊buffer會自動切換,反之亦然。而且右邊的buffer將公式自動換行了。十分方便。

浮點數指定小數位數

使用(format ...) 函式

#+ATTR_HTML: :border 2 :rules all :frame border  
| 計算時長(分鐘)       | 原時長 | 改造後時長 | 優化比率(%) |
|----------------------+--------+------------+-------------|
| 改造表計算時長總計   | 939.90 |      144.9 |       84.58 |
| 未改造表總計         |   1311 |       1131 |       13.73 |
| 未改造週期性提數總計 |     89 |         89 |        0.00 |
| 總計                 | 2339.9 |     1364.9 |       41.67 |
#+TBLFM: @5$2='(+ @[email protected]$2);N::@5$3='(+ @[email protected]$3);N::$4='(format "%0.2f" (* (/ (* (- $2 $3) 1.0) $2) 100));N


相關推薦

lisp在emacs org table進行電子表格計算

一句話,計算方面絕對比excel計算功能強。圖形方面我還沒有用過。對於程式設計者來講,用滑鼠拖拽操作還是用lisp編寫計算公式哪個更符合思考的習慣,我覺得是後者。我這裡只介紹lisp計算公式,如果關注簡單的Calc計算公式,可以參考官方文件。如何引用表格中其他欄位推薦寫法,@

“System.OutOfMemoryException”類型的異常在 mscorlib.dll 發生,但未在戶代碼進行處理

測試 未在 bsp 如果 文件流 回收 結構 聲明 邏輯 “System.OutOfMemoryException”類型的異常在 mscorlib.dll 中發生,但未在用戶代碼中進行處理 這個原因肯定不是因為程序內部的邏輯錯誤,或者別的什麽情況。 想想,肯定是因為大

LUA table函數的調

func tro 方式 聲明 隱藏 img spa src pan 1 lua中函數作為表中元素時有三種定義方式 采用‘:’來定義,實際上隱藏了一個形參的聲明,這個形參會截獲調用函數時的第一個實參並把它賦值給self 2 調用方式,點號和冒號 functb:hello1(

案例:在表格進行新增一行與刪除一行

ren 鏈接 默認 mage button 進行 cli ytd 超級鏈接 1.情況    2.思路   /*     * 為 #employeetable 的所有的 a 節點添加 Onclick 響應函數:     * 1. 彈出確認對話框: 確定要刪除 xx 的信息

lnmp.org的lnmp下安裝ftp(pureftp)

linux lnmp pureftp ftp公司服務器用lnmp.org一鍵安裝的環境。發現1.4有一些問題,後來仍改為1.3然後,按教程,安裝pureftp,https://lnmp.org/faq/ftpserver.html進入到lnmp1.3目錄下,./pureftpd.sh即可。教程頁面內容較多,大

UVa512追蹤電子表格的單元格詳解

stdlib.h else body class HR 刪除列 ont include 變化 解題思路: 因為我們最終要查找的是一開始的那些單元格的最終的位置,所以每次變換後,我們只記錄更新這些單元格的位置 1、註意的地方:如:實施刪除操作時,如果刪除多行,指的是在同一個表

Confluence 6 進行戶管理的優化配置和限制的基本建議

Confluence避免跨目錄的多個用戶名:如果你連接了超過一個的目錄服務器,我們建議你需要確定你的用戶名在目錄服務器中是唯一的。例如:我們不建議你定義一個用戶同時在'Directory1' 和 'Directory2' 中都定義 jsmith 這個用戶。這樣要求的原因是避免在

HTML怎麼讓table的td內容過長顯示為固定長度,多餘部分省略號代替

HTML如何讓table中的td內容過長顯示為固定長度,多餘部分用省略號代替 這個問題呢,是由於我們公司測試的部門測出來的,雖然說測試的內容本身就是個BUG,不過這個也讓我學到了一個比較好的歸類於佈局的一個小技巧,就是將td標籤中過長的內容只顯示為這個td的width的長度,之後的便以省略號

使用js對在網頁開啟Excel表格,並進行自動求和操作。

js-Excel Js is used to operate Excel tables and realize automatic summation. 使用js對在網頁中開啟Excel表格,並進行自動求和操作。 使用的外掛:js-xlsx 程式碼地址:https://g

SVN遷移 程式碼並在pycharm進行程式碼提交的詳細配置

SVN 程式碼的遷移與提交 文章目錄 SVN 程式碼的遷移與提交 1.簽出原始碼到本機 2. 文件的修改 3.pycham中svn配置 1.簽出原始碼

Windows Eclipse進行WordCount報錯org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/Strin

報錯:Exception inthread "main" java.lang.UnsatisfiedLinkError:org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z 解決: C:\Windo

python解析pdf的文字與表格【pdfplumber的安裝與使用】

我們接觸到的很多文件資料都是以pdf格式存在的,比如:論文,技術文件,標準檔案,書籍等。pdf格式使得用機器從中提取資訊格外困難。 為了解決這個問題,我找到了幾種解決方案,最後選擇了python上的pdfplumber庫,安裝和使用都相對比較方便,效果也還不錯,所以下面介紹這個庫的安裝與使用。 安裝我的電

layuitable的資料進行判斷(0、1)轉換為提示資訊

需要把“1”改成中文漢字: 在 done方法裡面進行資料渲染: layui.use('table', function(){ var table = layui.table ,form = layui.form; tab

在PHP建立和編輯Excel電子表格

要使用純PHP建立或編輯Excel電子表格,我們將使用PHPExcel庫,它可以讀寫許多電子表格格式,包括xls,xlsx,ods和csv。在我們繼續之前,仔細檢查您的伺服器上是否有PHP 5.2或更高版本以及安裝了以下PHP擴充套件:php_zip,php_xml和php_gd2。 建立電子表格 建立電子表

JavaHWPFDocument對03word進行插入表格和內容

import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.usermodel.Range; import org.apach

如何去掉bootstrap table表格樣式橫線豎線

            修改之前,表格看上去比較擁擠,因為bootstrap table外掛中自帶斑馬線表格樣式,有橫線和豎線分欄,現在我們不需要這些。應UI設計的要求,要去掉中間的橫線和豎線,使用了修改需求中一種簡單粗暴的修改方法,打卡網頁F12鍵,找到橫線豎線所對應的位置,直接新增程式碼border:0p

Table的td,th了Colspan或者Rowspan之後,設定寬度無效的解決方法

最近用到td中的Colspan,後來設定寬度的時候發現怎麼搞都無法實現到自己想要的效果,最後就把table中的第一行設定為無colspan和rowspan屬性的,該是幾列就幾列,然後把每列寬度設好,用百分比哦,我這裡用

SQLAlchemy例項物件來進行資料庫表資料的增刪改查操作(db.session.xx)

#encoding:utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy import config app = Flask(__name__) app.config.from_obje

python統計資料庫sqlite某一table的記錄行數

conn.execute('''CREATE TABLE IF NOT EXISTS ADDRESSDB(MacAddress CHAR(50),NewAddress CHAR(50) );''') cursor = conn.cursor

js將html table導成excel表格,IE、Google Chrome都能

需求:新增一個按鈕,將html中的指定table儲存為Excel檔案。 在網上search了許多方案,有的只能在IE上用,有的依賴什麼什麼軟體,有的能在Google Chrome上用,不能在IE上用。 我是東拼西湊,再加