3.1 基本用法
esProc 提供了 clipboard() 函数,可以与剪贴板交换数据。
下面用“各科前 3 名的学生”为例进行说明。
Excel 中处理前的数据如下,其中 A 列是学生姓名,B-D 列分别是数学、英语、物理成绩。
A | B | C | D | |
---|---|---|---|---|
1 | name | math | english | physics |
2 | lily | 97 | 100 | 99 |
3 | Joshua | 100 | 99 | 100 |
4 | Sarah | 98 | 99 | 96 |
5 | Bertram | 94 | 95 | 85 |
6 | Paula | 91 | 88 | 91 |
7 | Sophia | 92 | 81 | 76 |
8 | Ben | 87 | 80 | 76 |
9 | Ruth | 92 | 91 | 87 |
10 | Pag | 95 | 87 | 87 |
计算目标:求出每学科成绩前 3 名的学生,并追加到本科目成绩之后。
这个任务要用到行集合 TopN、按序号拼接等功能,Excel 本身不好实现,但借助 SPL 则很容易。
先在 Excel 中选中源片区 (A1:D10),按 Ctrl+C,复制到系统剪贴板,打开集算器,编写并执行如下脚本:
A | |
---|---|
1 | =clipboard().import@t() |
2 | =A1.top(-3;math).(name) |
3 | =A1.top(-3;english).(name) |
4 | =A1.top(-3;physics).(name) |
5 | =join@p(A2;A3;A4).export() |
6 | =clipboard(A5) |
A1 从剪切板读取数据
A2 math 前 3 名
A5 拼成二维表,转成字串
A6 向剪切板写数据
上面代码中,clipboard()函数有两种形态,其中无参数调用该函数时,可取出剪贴中的字符串,如 A1 格;以变量或格名为参数调用该函数时,可向剪贴板写入字符串,如 A6 中的 clipboard(…)。
执行上述脚本后,在 Excel 的 B11 格用 Ctrl+V,即可将剪切板中的数据复制到 B11-D13,如下:
A | B | C | D | |
---|---|---|---|---|
… | … | … | … | |
10 | Pag | 95 | 87 | 87 |
11 | Joshua | Lily | Joshua | |
12 | Sarah | Sarah | Lily | |
13 | lily | Joshua | Sarah |
大佬,这个 clipboard 很好用。
但是,我在 excel 插件中使用剪贴板功能时出现一些小问题, 比如:
在 excel 里写 spl 语句: =spl(“=clipboard().import@t()”)
1、如果从 EXCEL 当前工作簿或者其它工作簿复制数据,执行上述语句,excel 里出不来结果。
2、如果从 word 文档或者从其他非 EXCEL 的地方复制数据,EXCEL 里是可以呈现结果的。
是不是我哪里操作错了?同样的语句在 IDE 里执行都能出结果。
clipboard 要手工操作的,在插件里天知道几时会触发执行它,从来没考虑过还有这种用法😳
😄 就是复制 excel 里的东西不好使,复制其他地方的都可以。
大佬,我还有个问题:
能不能实现对 json 风格的对象直接赋值,比如,
dic={A:1} 可以实现 dic.A+=1 或者 dic.A=2 达到修改的目的
但是如果键不存在,dic.B=3 这样就不行了。
从 Excel 能复制到 SPL IDE,当然是可以接收 Excel 复制的东西,但在 Excel 里搞不清那个触发次序了,结果没法预测。都在 Excel 里,直接引用格子区域不就完了。clipboard 和环境相关性太强,只适合手工动作。
序表的字段是相对严肃的属性,不支持直接这样赋值添加。不好说是报错还是添加哪个更优先,通常数据库会选择前者,SPL 延用了这个规则。
好的,谢谢大佬!
Function 那一节 get 函数,最后一个示例是不是弄错了,A5 出不了结果。
麻烦方便的时候测试一下:
http://d.raqsoft.com.cn:6999/esproc/func/getlevel.html