请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Clint

金牌服务用户

16

主题

46

帖子

154

积分

金牌服务用户

积分
154
Clint
金牌服务用户   /  发表于:2025-4-15 14:27  /   查看:86  /  回复:7
1金币
本帖最后由 Clint 于 2025-4-15 14:29 编辑

问题描述:
先设置了单元格格式(百分比),然后对该单元格进行了setValue的操作,此时页面中展示为百分比,然后直接导出,excel中单元格展示为小数

下面是demo以及操作步骤:
步骤一:设置单元格格式(sheet: 0, row: 0, col: 0) 百分比

image.png293815306.png
步骤二:设置值,在input框中输入0.15,然后点击“设置值”按钮
image.png15136107.png
步骤三:点击“导出”查看excel,此时excel中展示0.15,而非页面中的15%
image.png846762695.png


PS:如果在步骤二后,点击单元格上方的input输入后再导出,excel中显示为正常的15%
image.png286806029.png image.png705700988.png
但是实际应用中无法挨个单元格点击,请提供解决方案,十分感谢!!!~~~



vue2.zip

158.17 KB, 下载次数: 3

最佳答案

查看完整内容

将代码中设置值的API由setValue()修改为setText(),如下代码: 然后对A2:K2单元格依次设置了单元格格式列表中的非自定义格式,依次为:常规、数字、货币、会计专用、短日期、长日期、时间、百分比、分数、科学计数、文本,导出后发现各格式显示与SpreadJS一致,如下图所示: 咱们对单元格手动填充数据时,SpreadJS和Microsoft Excel均可以根据输入内容自动解析,比如输入的是纯数字序列,该数据就作为数字存在,Worksh ...

7 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:6 天前
来自 6#
Clint 发表于 2025-4-16 15:17
是的,实际业务中会批量setValue,目前都是字符串的形式,而且并不知道每个单元格需要的数据格式,可能有 ...

将代码中设置值的API由setValue()修改为setText(),如下代码:
1744795306579.png367714843.png

然后对A2:K2单元格依次设置了单元格格式列表中的非自定义格式,依次为:常规、数字、货币、会计专用、短日期、长日期、时间、百分比、分数、科学计数、文本,导出后发现各格式显示与SpreadJS一致,如下图所示:
1744795187428.png721683349.png

咱们对单元格手动填充数据时,SpreadJS和Microsoft Excel均可以根据输入内容自动解析,比如输入的是纯数字序列,该数据就作为数字存在,Worksheet:getValue()获取的结果其数据类型即number;输入字符串,Worksheet:getValue()即string类型数据;输入日期字符串”2025-04-16“,Worksheet:getValue()的结果数据类型为object。但是,无论哪种数据类型,Worksheet:getText()结果均为string类型数据。那么,以此倒推,可以使用Worksheet:setText()对单元格填充数据,SpreadJS便可以自动识别数据以处理其格式。您可以亲测了解下。

回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:6 天前
2#
您好!输入框输入的数据是string类型,如下图所示:
1744701018090.png508988036.png

在对单元格设置数据之前,使用Number.parseFloat()将string数据解析为number数据即可,如下代码所示:
1744701210295.png161454772.png

修改代码后,运行程序,参考您提供的操作步骤,如下动图所示,可见导出所得的xlsx文件经Microsoft Excel打开后A1单元格显示数据与SpreadJS中一致:
百分比.gif
回复 使用道具 举报
Clint
金牌服务用户   /  发表于:6 天前
3#
Wilson.Zhang 发表于 2025-4-15 15:14
您好!输入框输入的数据是string类型,如下图所示:

感谢您的答复,
但是在实际业务中,setValue的过程是批量的,我无法判断到每个单元格的数据类型,
有没有什么方法,执行之后,就会将类型强制转化(就像ps中提到的场景,点击单元格之后,再导出就不会有问题了)
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:6 天前
4#
Clint 发表于 2025-4-15 16:57
感谢您的答复,
但是在实际业务中,setValue的过程是批量的,我无法判断到每个单元格的数据类型,
有没 ...

“无法判断到每个单元格的数据类型”是否意味着您需要在单元格中填充的数据除了数字number外,还有字符串,如公式等?

如果是这样的话,那就不能对<input>标签设置type属性值为number来限制输入内容为数字。

不需要判断每一种数字类型,可以梳理下在您的业务场景中可能会使用到的数据,比如有数字、公式、日期时间等。当前代码中的值输入框的数据是string类型,那就在对单元格填充数据之前通过模式判断下数据是否可能是公式或日期,也可以制定正则表达式匹配纯数字序列,这便是要作为数字存在的数据,对其使用Number.parseInt()或Number:parseFloat()解析即可。
回复 使用道具 举报
Clint
金牌服务用户   /  发表于:5 天前
5#
Wilson.Zhang 发表于 2025-4-15 17:24
“无法判断到每个单元格的数据类型”是否意味着您需要在单元格中填充的数据除了数字number外,还有字符串 ...

是的,实际业务中会批量setValue,目前都是字符串的形式,而且并不知道每个单元格需要的数据格式,可能有日期,百分比,自定义;

由于setValue之后,页面中的展示值是没有问题的,所有还是期望在所有setValue后,执行一个方法来对所有单元格的值强制按单元格格式转化一下,想问问有没有上述的方法

简单的说,前置判断类型解决,成本过高,有没有setValue之后的后置解决方案
回复 使用道具 举报
Clint
金牌服务用户   /  发表于:5 天前
7#
Wilson.Zhang 发表于 2025-4-16 17:30
将代码中设置值的API由setValue()修改为setText(),如下代码:

十分感谢!!!~
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:5 天前
8#
Clint 发表于 2025-4-16 17:40
十分感谢!!!~

不客气,问题既已得到解决,那就结贴了。如遇新问题,欢迎发新帖沟通。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部