找回密码
 立即注册

QQ登录

只需一步,快速开始

爱德

金牌服务用户

3

主题

11

帖子

42

积分

金牌服务用户

积分
42
最新发帖
爱德
金牌服务用户   /  发表于:2024-12-6 17:31  /   查看:141  /  回复:10
本帖最后由 爱德 于 2024-12-6 17:53 编辑

目前,我们使用SpreadJS来做数据填报系统,填报的表单由用户自定义,大约是这样的步骤:

1、用户的管理员自定义创建数据模型(类似于数据库表格),然后基于该数据模型的字段制作SpreadJS的模板;
2、发布填报任务,填报人打开填报页面,该页面加载模板;
3、填报完成,用sheet.getDataSource().getSource()获取数据,调用数据模型的通用新增接口,将数据保存到数据库。

现在,我们有后台计算的需求,比如:
1、有2张填报表和1张结果表:填报表A、填报表B、结果表C;
2、结果表C里有大量的公式,需要引用A表和B表填报的数据,同时也引用了系统产生的业务数据;
3、大屏看板里的内容和数据,来自C表。
希望用户在填报A表或B表后,或者产生了新的业务数据后,C表会自动计算更新,大屏看板的数据也会同步更新。

gc-excel作为后台表格组件,有数据绑定和模板语言,可以将数据绑定到模板上,之后可以生成文件,可以下载。
但是我如果要入库呢,在后台将采集到的数据或者新的业务数据绑定到C表的模板之后,怎么获取到绑定并计算完成后的数据,去保存到数据库?

前台可以通过sheet.getDataSource().getSource()来获取到结构化的数据,而不用管数据在哪个单元格,也不用管具体的数据结构,可以实现通用的采集功能。
gc-excel呢,如何在后台获取到这种结构化的最新数据?

(这里以3张表举例,实际上可能整个套表多达几十个sheet,计算关系复杂,比如sheet1至sheet10用于采集,sheet11-sheet15进行一轮计算,sheet16-sheet20又基于前面15个sheet进行第二轮计算等等。初步思路是,将这样的套表制作成模板,在后台用gc-excel来计算,计算完成并入库;目前的难点是,计算完成,怎么获取到数据?和spreadjs不同,gc-excel的数据源不是双向绑定的)。

10 个回复

倒序浏览
Wilson.Zhang
超级版主   /  发表于:2024-12-6 17:55:36
沙发
回复 使用道具 举报
爱德
金牌服务用户   /  发表于:2024-12-6 17:59:46
板凳
本帖最后由 爱德 于 2024-12-6 18:10 编辑

这个方法获取到的仍然是绑定到模板上的数据源,并不是计算后的数据,我需要在模板里完成计算,获取最新的结果数据。

比如有三个字段:A、B、C,其中C=A+B,A和B是采集的数据,C需要根据采集的数据来计算,绑定模板的时候,数据源是:
{
    A: 100,
    B: 200,
    C: null
}
绑定完成,getDataSource获取到的仍然是原有的数据源对象,其中的C并不会变成300,虽然excel里显示的C是300,或者获取单元格的值也是300,但这个值并不会更新到数据源对象的C属性上,和spreadjs不同,它不是双向绑定的。
回复 使用道具 举报
爱德
金牌服务用户   /  发表于:2024-12-9 10:46:12
地板
我这种需求其实是:填报数据->绑定模板->完成模板计算->结果入库。

请问有推荐的解决方案吗?
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-12-9 11:03:45
5#
本帖最后由 Ellia.Duan 于 2024-12-9 11:46 编辑

您好,大概理解了下您的需求。确实GcExcel没有双向绑定,这是因为,GcExcel 是后端产品,没有UI界面,那么就没有双向绑定的概念。
比如说,前端SpreadJS有UI界面,用户做了相应的调整,此时getDataSource()可以获取到最新的值,但是GcExcel 并没有UI操作的动作,所以getDataSource()只能拿到当时从数据库里面设置的值。(拿不到公式计算后的结果)

针对您的需求,是否可以截图示例下 ,您的C表模板大概长什么样子。


GcExcel中,如果用来定时任务,完成公式计算,通常用getValue来获取公式计算后的值。
以及,看下单元格绑定,是否满足您的需求:
https://demo.grapecity.com.cn/do ... a/demos/cellbinding
回复 使用道具 举报
爱德
金牌服务用户   /  发表于:2024-12-9 12:46:26
6#
本帖最后由 爱德 于 2024-12-9 12:47 编辑

举最简单的例子:

采集表A,需要采集一个值,数据源是{A: null},前端保存数据源getDataSource即可,不用管A字段位于哪个单元格;
采集表B,需要采集一个值,数据源是{B: null},前端保存数据源getDataSource即可,不用管B字段位于哪个单元格;
结果表C,需要对A和B进行求和计算,它的数据源是:{A: null, B: null, C: null},A和B是来自于采集后保存到数据库里的值。

为结果表C制作模板,将A、B、C绑定到单元格上,并对C设置公式:
(1) 模板一:A、B、C字段绑在sheet1的A1、A2、A3单元格,A3单元格设置公式=A1+A2;
(2) 模板二:A、B字段绑在sheet1的A1、A2,C字段绑在sheet2的A1单元格,设置公式=sheet1!A1+sheet1!A2;
(3) 模板三:A字段绑在sheet1的A1,B字段绑在sheet2的A1,C字段绑在sheet3的A1单元格,设置公式=sheet1!A1+sheet2!A1;
……
后台计算时,加载结果表C的模板,然后加载采集到的数据,将数据源绑在模板上,然后获取计算结果C的值并保存到数据库。希望任意的模板(比如以上三个模板中的任意一个),都能用同一套通用代码,获取到字段C的值进行保存,不用管它位于哪个单元格。

如果用getValue取单元格的值,那就是定制开发了,而这套系统需要是通用的,在部署给客户后,由客户的管理员自己创建数据模型和制作excel模版,至于某个字段绑在哪个sheet的哪个单元格,都是未知的。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-12-9 15:04:04
7#
目前GcExcel 暂不支持双向数据绑定,我们可以给您报个需求。
针对您的问题,SpreadJS支持双向数据绑定,在打开看板时,加载C表,是否可以实现您的需求呢?
回复 使用道具 举报
爱德
金牌服务用户   /  发表于:2024-12-9 15:19:19
8#
后台计算的结果,不是仅存在于excel文件中就行,最关键的是需要“入库”,除了看板之外,其他页面也可能会用到。

大致了解了,谢谢回复,我再想想其他办法。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-12-9 17:43:36
9#
SpreadJS 公式计算的能力也很强,在打开C表时,进行公式计算,进行看板渲染,同时将值可以保存到数据库中。
当第二次打开看板时,可以直接从数据库取值,不用SpreadJS进行二次公式计算。

或者SpreadJS提供了公式计算的接口,如:
  1.         sheet.setValue(0, 0, 1);
  2.         sheet.setValue(1, 0, 2);
  3. //使用EvaluateFormula()方法来计算公式,而无需在表单的单元格中设置公式
  4.         var result = GC.Spread.Sheets.CalcEngine.evaluateFormula(sheet, "SUM(A1:A2)", 0, 0);
  5.         console.log("SUM(A1:A2) = " + result);
复制代码
在上述代码中,使用了计算引擎的evaluateFormula直接进行公式计算取到公式结果。

上述回复仅供参考。
回复 使用道具 举报
爱德
金牌服务用户   /  发表于:2024-12-9 18:11:15
10#
谢谢回复,spreadjs无法解决这个问题,是后端的问题,至于为什么需要后台计算,是因为没有前端场景。

比如:C=A+B+D+E,A和B来自于用spreadjs实现的填报,D来自系统产生的其他业务数据,E由半夜的定时任务产生,这样就有3种场景需要计算C:
1、用户填报A和B时,需要计算C并入库,用户可能没有权限看C表,C表不能打开给他看;
2、用户在使用系统过过程中产生了新的D,需要计算C并入库;
3、定时任务在产生新的E后,需要计算C,也没有前端打开C表的场景。

C表仅仅是举例,其实是一整套表,几十个sheet,普通用户没有打开这个套表的场景。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部