兄弟,我去了。
这么说吧,这种计算,直接做是真的做不了。
自定义公式是很强大,应用领域也很广泛,但是,自定义公式干不了这个事儿。
1.自定义公式能干列间计算,但是我和楼主需要的是行间计算。只要把数据装到活字格的表格中,那就是一个关系型了,只要是关系型,列的定义就必须唯一,同一列中,不能有的值是计算的结果,有的值是用户的输入
2.自定义公式,前面省略了主语,是谁自定义公式,这一点我们与活字格的理解有偏差,我们认为是允许最终用户(end user)自定义,但是活字格官方的意思其实是允许开发者自定义公式,因为在活字格来看,我们这些开发者才是用户。
3.这个自定义公式,可以认为是某种程度的封装,把一个相对比较复杂的算法(其实就是计算公式,还谈不上算法)进行了一步封装,以便后面可以更方便的调用。这个相对比较复杂的算法被封装在了前端 JS 中了,由客户端的算力来进行计算。
但是,这次去,有了一个新思路。
活字格的底层本质上是 spreadJS,而 SpreadJS 的每个 sheet ,是由一个大 Json 构成的,这一个大 Json 是一个字典,当然,我这里说的字典是数据结构的字典,不是指项目中的字典表的那个字典。在这个字典中,每一个格子都是一个元素,而这个元素有一些属性,比如这个格子在哪一行,在哪一列,字体、字号、颜色等等,都是这个格子的属性。
这个格子还有两个最重要的属性,一个是 value,一个是 formula,value 的值就是格子的值,formula 的值就是为这个格子绑定的公式。
- {
- ……
- "value":"2021/12/6",
- "formula":"=TODAY()"
- }
复制代码
因为活字格的特性,活字格只向外层开放了 value,并不开放 formula,也就是说,在活字格的设计器中,是不允许开发者或者最终用户用各种办法去改 formula 的值的。
这种保护机制是对的,否则活字格的表格就崩了,甚至于连页面都无法生成了。因为生成页面时,要把每一个格子转换为一个 DIV,如果开放了 formula ,你知道这帮开发者会往格子上绑什么公式啊?活字格这么多开发者,客服每天甭干别的了,就解决生成页面崩溃的问题吧。
所以绝对不能开放 formula 。
但是,只有把一个可以计算的字符串(如"=Y8*Y9+Y10*Y11")填到 formula 中,才会计算,而 formula 不开放,我们无论怎么搞,都是把字符串填到了 value 中,所以只是把一个字符串赋值给了一个单元格,这种赋值是不计算的。
有的同学问了,我在表格的模板行中的某一个格子中,是可以写入公式的呀?而且页面加载后,这个公式也是计算的呀,你为什么说不计算呢?这位同学,是计算,但是你这一列必须按照同一个公式进行计算,而我的表格中即便是同一列中,不同行的公式也是不一样的。
知道了这个原理,我们也就死心了,这个事儿直接用活字格干不了。
注意,我说的是直接
那不直接呢?疫情前,我是把 spreadJS 封装到了活字格里
对嘛,此处不让算,自有让算处啊,既然活字格不给算,那我用 spreadJS 算啊,可是也不行,因为活字格底层就是 spreadJS,我调 spreadJS 的方法时,解释器就蒙了啊,他不知道我要调谁的方法了啊,是活字格内嵌的 SpreadJS 的方法还是我导入的 SpreadJS 的方法啊,这不能一个马俩脑袋呀(此处听不懂那是因为你不听相声)!
为了解决这个矛盾,我用一个闭包把 导入的这个 SpreadJS 包起来了,这样就不会出错了。
但是,我能这么干是因为我买了 SpreadJS 的授权了,其他的小伙伴可不行了呀,活字格已经有成本了,再叠加一个 SpreadJS 的授权,咋还学上中国移动了呢,双向收费呀?
我们做开发,从来不是一个技术问题,我们所谓的技术问题本质上都是一个经济问题。我们不是让开发人员从技术上解决问题,我们是让开发人员用最经济的成本来解决问题。
这次,雷工和梁工告诉了我一个办法,你可以绕过活字格的封装,在浏览器中拿到底层的 SpreadJS。
你只要能在浏览器中拿到底层的 SpreadJS,你就可以直接给一个格子的 formula 写值了:
- sheet.setValue(5, 1, 'Formula:');
- sheet.setFormula(6, 1,'=FORMULATEXT(C7)');
复制代码
|