找回密码
 立即注册

QQ登录

只需一步,快速开始

肉夹馍汉堡
金牌服务用户   /  发表于:2023-8-17 16:57  /   查看:3438  /  回复:12
1金币
示例demo:

https://jscodemine.grapecity.com/sample/CPFCPUY98EWppDs_YoqWOg/

在日期列使用MAX函数,结果错误

如图
image.png375872191.png

image.png52327574.png

最佳答案

查看完整内容

一个单元格中有三个属性,分别是value、text和formatter。 value为单元格的最真实的值。 text为单元格显示在UI上的值,并且会随着formatter和value的变化而变化。 比如:我现在有一个单元格的value值为:2000/01/01(文本类型),那么当我修改了 formatter为 yyyy/mm 后,text就由原来的 2000/01/01 变成了 2000/01,而value值是不会发生变化的。 您的这个操作就属于我上述的情况,您只修改了formatter(格式),没 ...

12 个回复

倒序浏览
最佳答案
最佳答案
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-17 16:57:52
来自 13#
本帖最后由 Joestar.Xu 于 2023-8-24 14:28 编辑
肉夹馍汉堡 发表于 2023-8-24 11:03
还得请教一下,我这边按原来的代码逻辑,不使用new  Date进行转换,现在手动设置改列的日期格式,但是 ...

一个单元格中有三个属性,分别是value、text和formatter。

value为单元格的最真实的值。

text为单元格显示在UI上的值,并且会随着formatter和value的变化而变化。

比如:我现在有一个单元格的value值为:2000/01/01(文本类型),那么当我修改了 formatter为 yyyy/mm 后,text就由原来的 2000/01/01 变成了 2000/01,而value值是不会发生变化的。

您的这个操作就属于我上述的情况,您只修改了formatter(格式),没有将value从文本类型转换成日期类型,MAX函数只能针对日期类型求最大值,而无法对文本类型求最大值。

再回到您的问题上来,虽然这个单元格的value值为文本类型,但由于我们SpreadJS可以将其识别为时间类型,所以可以对其进行有限(value本质是文本类型)的格式化。然而其value值仍为文本类型,因此仍旧无法被MAX函数计算。

目前我们只有MAX函数这一个解决方案能够计算出一些列事件的最大值。

您可以去我们官网Demo(https://demo.grapecity.com.cn/SpreadJS/WebDesigner/index.html)中运行以下代码,观察两个单元格的“设置单元格格式”中的区别,能够帮助您理解我上述的解释:

let designer = GC.Spread.Sheets.Designer.findControl(document.querySelector(".gc-designer-container"));
let spread = designer.getWorkbook();
let sheet = spread.getActiveSheet();
sheet.setValue(0, 0, "2000/01/01");
sheet.setValue(1, 0, new Date("2000/01/01"));

image.png892111511.png

image.png307410887.png
回复 使用道具 举报
Richard.HuangSpreadJS 开发认证
超级版主   /  发表于:2023-8-17 17:53:32
2#
您好,我未复现您描述的问题,请问能否提供一个可供复现的Demo,以便我们更好的为您解决问题
image.png787878722.png
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-17 17:56:09
3#
您好,正常情况下的时间应该是一个数字:

image.png785552367.png

而不是文本:

image.png800749206.png

只有为数字的时候才能够正常计算(MAX函数只能针对一系列数字取最大值):

image.png46224669.png
回复 使用道具 举报
肉夹馍汉堡
金牌服务用户   /  发表于:2023-8-17 19:21:40
4#
Joestar.Xu 发表于 2023-8-17 17:56
您好,正常情况下的时间应该是一个数字:

目前我们通过spreadJS编辑,编辑时发现上述问题,编辑后用GGexcel采用相同的逻辑生成,是正常的,gcexcel生成的请见附件的ssjson

dat.ssjson

62.05 KB, 下载次数: 373

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-18 10:41:11
5#
本帖最后由 Joestar.Xu 于 2023-8-18 10:42 编辑

我将您通过GCExcel生成的ssjson导入到SpreadJS后如下图所示:

image.png479107970.png

F列时间的Value值实际上都是数值,所以此处算出来的最大值也是一个数值:

image.png882413329.png

修改它的单元格格式后就可以得到您所需的结果:

image.png185080870.png

综上所述,您在SpreadJS中编辑没能成功的根本原因是您在编辑的时候将时间当做了一个字符串去输入,而不是数值,也就是说其Value的值是文本,而不是数值,所以在取最大值的时候就出现了问题。

您可以将您通过GCExcel导出的文件导入到SpreadJS中后再和您之前SpreadJS编辑的结果对比一下。
回复 使用道具 举报
肉夹馍汉堡
金牌服务用户   /  发表于:2023-8-23 11:18:19
6#
Joestar.Xu 发表于 2023-8-18 10:41
我将您通过GCExcel生成的ssjson导入到SpreadJS后如下图所示:

image.png331006774.png

同一份模版数据,目前只是在数据表绑定阶段,左边是使用spreadJS,右边使用GCexcel,您的意思是说因为数据格式的问题导致,max函数对时间失效,所以我们想知道,用不同的插件(spreadJS与GCexcel)是否会导致结果不一至,我们如何避免
spreadJS绑定,请见顶楼的demo链接
gcexcel绑定结果请见,附件:demo_max_date.ssjon

excel模版:template_max_date.json

template_max_date.json

10.34 KB, 下载次数: 389

demo_max_date.ssjson

81.89 KB, 下载次数: 377

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-23 11:48:01
7#
本帖最后由 Joestar.Xu 于 2023-8-23 11:58 编辑

您这边GCExcel和SpreadJS在填充数据的时候使用的是同一份数据源吗?

我看了一下您一开始提供的Demo,数据源的时间都是文本类型,您在填充GCExcel的时候也是将文本类型的时间填充进模版了吗?

——————————————

另外,我修改了一下您一开始提供的Demo,您可以直接再次打开查看:

image.png838363647.png

这一步将您数据源中的字符串类型的日期修改为了可以被SpreadJS识别的时间类型,这个时候就能正确计算出结果了。

image.png679960021.png

这也正与我上文中所述的观点一致,是因为数据源中存在字符串类型的时间导致的。

所以,您说的GCExcel可以正确填充,推测是您GCExcel的代码中对这种字符串类型的日期做了处理,使其能够被正确识别为日期格式。
回复 使用道具 举报
肉夹馍汉堡
金牌服务用户   /  发表于:2023-8-23 12:02:14
8#
Joestar.Xu 发表于 2023-8-23 11:48
您这边GCExcel和SpreadJS在填充数据的时候使用的是同一份数据源吗?

我看了一下您一开始提供的Demo,数 ...

同一份数据源,相同格式的,GCexcel是用jsonDataSource进行绑定的,目前可能是调用 workbook的autoParse方法,自动识别为日期格式。但是spreadJS中,应该也有类似自动识别的功能吧,例如在输入时,有autoParse机制,是不是spreadJS在绑定数据的过程中,类似机制失效,只能手动设置格式
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2023-8-23 12:27:23
9#
肉夹馍汉堡 发表于 2023-8-23 12:02
同一份数据源,相同格式的,GCexcel是用jsonDataSource进行绑定的,目前可能是调用 workbook的autoParse ...

GCExcel是一个没有交互界面的产品,但是SpreadJS是可以直接在UI界面上交互的,也就是说直接在SpreadJS界面上输入一个日期是可以直接被识别为日期的。

但是因为您这边用的是绑定数据源做的,绑定数据源简单理解就是setValue,那么在setValue中设置了一个文本字符串日期后,和你在界面上直接输入一个日期,二者的Value是不一样的,前者会直接被识别为一个文本,后者则是会被识别为数值。

因此需要您这边将提前将数据处理一下再setDatasource,正如我在您一开始的Demo中做的一样,这样就能够得到正确的结果了。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部