找回密码
 立即注册

QQ登录

只需一步,快速开始

bakefish

金牌服务用户

2

主题

11

帖子

53

积分

金牌服务用户

积分
53
最新发帖
bakefish
金牌服务用户   /  发表于:2022-10-3 14:19  /   查看:2221  /  回复:9
200金币
使用贵司的在线编辑器

在线 Excel 编辑器 | SpreadJS 在线表格编辑器 (grapecity.com.cn)
使用vlookup匹配两组数据,结果
(1)第一个没有正确查找
(2)其余公式变成文本,没有生效
文本问题.jpg

出错文件
文本问题.ssjson (54.02 KB, 下载次数: 298)

最佳答案

查看完整内容

关于公式计算错误的问题,原因是第一列中的数字都是文本,第5列中的是数字自然无法匹配,下面的截图是导出excel后的,看的会更清楚一些,因为excel对“以文本方式存储的数字”会有一个绿色角标,spreadjs不会 解决办法是通过代码sheet.setValue,或者在ui界面更改单元格格式统一为数字或文本后,再重新设置值,总之,保证两列都为数字或者都是文本即可 至于下面的几行显示了公式本身是设置的时候前面加了分隔符,公式会 ...

9 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-3 14:20:00
来自 3#
本帖最后由 Richard.Ma 于 2022-10-8 10:59 编辑

关于公式计算错误的问题,原因是第一列中的数字都是文本,第5列中的是数字自然无法匹配,下面的截图是导出excel后的,看的会更清楚一些,因为excel对“以文本方式存储的数字”会有一个绿色角标,spreadjs不会

image.png531617125.png

解决办法是通过代码sheet.setValue,或者在ui界面更改单元格格式统一为数字或文本后,再重新设置值,总之,保证两列都为数字或者都是文本即可

至于下面的几行显示了公式本身是设置的时候前面加了分隔符,公式会显示为文本
image.png253783873.png


2楼提到的问题,也是一个原因,匹配表中是文本,导出工作表中的AJ列是数字
如果要界面操作的话,只改单元格格式并不能改变单元格中存储的值,还要删除值后重新输入,在单元格为文本格式的情况下,输入的数字才会被存储为文本


image.png340010070.png




image.png846974181.png

评分

参与人数 1满意度 +5 收起 理由
bakefish + 5

查看全部评分

回复 使用道具 举报
bakefish
金牌服务用户   /  发表于:2022-10-3 23:59:53
2#
还有一个就是单元格格式问题,我发现用户直接设置单元格的类型和实际的数据类型不一样
比如
(1)BL列是要在查找匹配表里AJ列,虽然单元格设置了文本,但是找不到
单元格设置文本.jpg

(2)只有通过分列,重新设定单元格式


分列设置.jpg


(3)这个时候就正常了

自动匹配.jpg
测试文件
分列文本测试.ssjson (63.75 KB, 下载次数: 310)
回复 使用道具 举报
AlexZ讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-8 15:39:01
4#
bakefish 发表于 2022-10-3 23:59
还有一个就是单元格格式问题,我发现用户直接设置单元格的类型和实际的数据类型不一样
比如
(1)BL列是 ...

这个问题其实和前面一个类似

导出工作表中的 HKONT 列中的“数字”的值是数字
匹配表中的 代码 列中的“数字”的值是文本

所以,这两个匹配是不成功的

单元格设置的是显示格式,不影响值得修改

文本分列向导确实会影响值得变化,所以会成功

这个行为目前和 Excel 保持一致,也属于容易混淆得部分

有一个办法是在匹配函数中使用和文本合并得技巧,例如:

image.png581739501.png

评分

参与人数 1满意度 +5 收起 理由
bakefish + 5

查看全部评分

回复 使用道具 举报
bakefish
金牌服务用户   /  发表于:2022-10-9 10:28:09
5#
非常感谢两位!

关于文本和数字匹配这个实在太痛苦了,格式和类型,在Excel里就是一团糊涂账,现在spreadjs继承了Excel的用法,这种不确定性也跟着带进来了

setValue()是个好主意,我有两个问题想问:
1、为什么不干脆把那个设置格式,就用setValue()了,这样即减少困惑,又和它本身的含义一致
2、setValue,在GcExcel里有没有对应的API?我们现在很多逻辑是写在前端,自动化运行在后端。

谢谢
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-9 15:41:40
6#
1.通过代码(formatter)或UI设置格式主要是用来兼容excel的格式设置功能的,如果是一个空单元格设置后,再去通过界面输入数字,会影响在其在单元格中的类型(数字或者文本),但是如果是一个已经有值的单元格再设置,并不会改变这个值的类型

setValue设置值是强制改变了这个单元格的值,所以和格式反而没有关系,不会影响格式,比如说你现在的单元格格式是文本,然后setValue(0,0,10),这个时候单元格的值是数字10,但是单元格的格式没变,所以一旦你在界面上清除这个单元格值,再去输入一个10,去getValue 的话,依然会发现得到的是字符串'10'



2.后端GCEXCEL也是有setValue的接口的,同样的,也可以设置数字或者文本进去,按照你的需求,只需要设置数字就行。
另外,对于上述“以文本形式存储的数字”,也可以在后端先通过getValue做判断,如果是字符串的话,判断是否是数字,再setValue为相同的数字即可

  1. worksheet.getRange("A1").setValue("123");
  2. worksheet.getRange("A2").setValue(123);
复制代码

评分

参与人数 1满意度 +5 收起 理由
bakefish + 5

查看全部评分

回复 使用道具 举报
bakefish
金牌服务用户   /  发表于:2022-10-9 18:12:56
7#
Richard.Ma 发表于 2022-10-9 15:41
1.通过代码(formatter)或UI设置格式主要是用来兼容excel的格式设置功能的,如果是一个空单元格设置后,再 ...

谢谢,已经验证通过,并且在项目中开始广泛采用该方法来重设值类型。

下午验证的时候,我们是一个单元格一个单元格的setValue,GcExcel里,有没有什么批量写入的方法?
我们写入对象是个table,这个时候有没有什么好的方法,双重遍历写入,效率实在不高

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-9 18:19:16
8#
setvalue可以给sheet中的区域设置值的,传入一个数组就行

https://demo.grapecity.com.cn/do ... demos/setrangevalue

评分

参与人数 1满意度 +5 收起 理由
bakefish + 5

查看全部评分

回复 使用道具 举报
bakefish
金牌服务用户   /  发表于:2022-10-9 18:29:15
9#
Richard.Ma 发表于 2022-10-9 18:19
setvalue可以给sheet中的区域设置值的,传入一个数组就行

https://demo.grapecity.com.cn/documents-api ...

非常感谢!
刚好,我还有个问题是怎么批量读数,帖子里也有了:worksheet.getRange("A1:B7").getValue();
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-9 23:06:44
10#
嗯,没错,这样就能读出来
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部