David.Zhong 发表于 2021-11-16 18:06:32

mfkpie8 发表于 2021-11-16 15:16
晕了需要动态支持公式的木

大佬,我知道是想要支持动态设置公式,但是怎么实现呢?设计器中如何设计?我们的用户又怎么去动态设置公式呢?有通用的解决方案吗?这些都不清楚。

mfkpie8 发表于 2021-11-16 18:13:22

swejet 发表于 2021-11-12 16:06
我知道应用广泛,两年了这个问题也没搞定

我打算下个月到葡萄城总部去,要是还搞不定,就杀个程序员祭 ...

大佬他们说有没有解决方案

swejet 发表于 2021-11-17 10:12:44

mfkpie8 发表于 2021-11-16 18:13
大佬他们说有没有解决方案

我觉得的解决方案也是自定义公式,但是我还要配合着数据透视表,否则还要sql行转列,不仅仅是一个自定义公式的问题

David.Zhong 发表于 2021-11-18 18:28:11

大佬可以参考一下材料管理系统中的做法。


mfkpie8 发表于 2021-12-6 08:05:05

swejet 发表于 2021-11-12 16:06
我知道应用广泛,两年了这个问题也没搞定

我打算下个月到葡萄城总部去,要是还搞不定,就杀个程序员祭 ...

大佬你过去了 看看胡老板了吗?这个题如何解

swejet 发表于 2021-12-6 09:19:43

mfkpie8 发表于 2021-12-6 08:05
大佬你过去了 看看胡老板了吗?这个题如何解

兄弟,我去了。

这么说吧,这种计算,直接做是真的做不了。

自定义公式是很强大,应用领域也很广泛,但是,自定义公式干不了这个事儿。

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)');

mfkpie8 发表于 2021-12-6 11:23:28

swejet 发表于 2021-12-6 09:19
兄弟,我去了。

这么说吧,这种计算,直接做是真的做不了。


你是全能的大佬 真心感谢您 这么多的回复

mfkpie8 发表于 2022-4-19 17:08:55

swejet 发表于 2021-12-6 09:19
兄弟,我去了。

这么说吧,这种计算,直接做是真的做不了。


大佬有没有最佳方案呢?

mfkpie8 发表于 2022-11-19 17:52:54

本帖最后由 mfkpie8 于 2022-11-19 18:09 编辑

swejet 发表于 2021-12-6 09:19
兄弟,我去了。

这么说吧,这种计算,直接做是真的做不了。

新版本了新想法了是不是有新的逻辑了呢。计算器都能做了这个应该有想法了吧


https://gcdn.grapecity.com.cn/forum.php?mod=viewthread&tid=79998&fromuid=60953


用这个自定义可以不

Simon.hu 发表于 2023-12-6 13:50:01

mfkpie8 发表于 2022-11-19 17:52
新版本了新想法了是不是有新的逻辑了呢。计算器都能做了这个应该有想法了吧




这是目前的推荐做法

主要是大家的需求有行间计算,还有就是希望在页面上引用不同的格子执行,这些就有点太超纲了:'(
页: 1 2 [3] 4
查看完整版本: 大佬求解:如何能实现变量能传参数与运算方式 实现参数化