[alibaba/easyexcel]导出CSV时候,java类型是Long类型且数字长度大于15时候,导出会用科学计数法显示

2023-12-08 685 views
9

触发Bug的代码

     /**
     * 参数主键
     */
    @ExcelProperty(value = "参数主键")
    private Long id;

提示的异常或者没有达到的效果

导出效果图: image 希望在遇到会展示为科学计数法的数据在数据前面加个 “`” 符号

回答

9

而且还会有精度缺失 image

8

这个是wps或者office本身的功能缺陷或者特性,位数大概11位就是提示异常,会造成计算错误,但是如果采用科学记数法就不会导致错误 图像

确实是WPS或office的原因导致的,框架导出时候可以兼容一下的吧,把数字大的这种转成字符串格式

3

如果你不去操作excel,当它为科学计数法的时候,是能准确的记录数据的,包括参与函数运算,如果去操作之后,即出现这个提示,就需要显示的转为为数值类型。总之,正常而言,对于这种大数字(需要科学计数法的数字),正常的导入导出没有问题,包括计算也没有问题。

5

关于导出的时候,转化类型问题,可以通过传入自定义Converter解决

4

关于导出的时候,转化类型问题,可以通过传入自定义Converter解决

FO GCS~3J@ 87` BF1PJJ(Y `28{4~$(V9F{WSA_$ 5S105 主要是我自定义Converter也没效果,是csv不支持自定义Converter吗?还是我哪里错误?

1

如果你不去操作excel,当它为科学计数法的时候,是能准确的记录数据的,包括参与函数运算,如果去操作之后,即出现这个提示,就需要显示的转为为数值类型。总之,正常而言,对于这种大数字(需要科学计数法的数字),正常的导入导出没有问题,包括计算也没有问题。

你说的是excel吧,csv的话用记事本打开显示肯定没问题,但是导出的用户不会使用记事本打开,而且格式不利于分析,wps打开数据就会丢失精度,建议加一个可选配置,如果是大值可转为文本单元格的配置,默认不展示 image

5

可以参考一下我的写法

image

采用coverter是能准确修改类型,且在wps中展示效果为字符,如果选中也会提示警告,该类型为文本,不能参与到运算

image
2

如果你不去操作excel,当它为科学计数法的时候,是能准确的记录数据的,包括参与函数运算,如果去操作之后,即出现这个提示,就需要显示的转为为数值类型。总之,正常而言,对于这种大数字(需要科学计数法的数字),正常的导入导出没有问题,包括计算也没有问题。

你说的是excel吧,csv的话用记事本打开显示肯定没问题,但是导出的用户不会使用记事本打开,而且格式不利于分析,wps打开数据就会丢失精度,建议加一个可选配置,如果是大值可转为文本单元格的配置,默认不展示 image

excel的效果和csv差不多

3

这个是wps或者office本身的功能缺陷或者特性,位数大概11位就是提示异常,会造成计算错误,但是如果采用科学记数法就不会导致错误 图像

确实是WPS或office的原因导致的,框架导出时候可以兼容一下的吧,把数字大的这种转成字符串格式

这种改动会造成函数失效,如果该单元格被函数计算包含,则会导致函数计算结果错误,如果能显示的去标识是否被函数包含或者明确的需要字符类型展示效果,那可以考虑添加进去

是的,你们可以考虑一下,不然长度大于15的话还会丢失精度,参与计算也没用了

4

可以参考一下我的写法 image 采用coverter是能准确修改类型,且在wps中展示效果为字符,如果选中也会提示警告,该类型为文本,不能参与到运算 image

你用这个代码试试导出20位的Long变量

6

可以参考一下我的写法 image 采用coverter是能准确修改类型,且在wps中展示效果为字符,如果选中也会提示警告,该类型为文本,不能参与到运算 image

20位好像没走这个自定义的转换器

7

long的最大值也19位,使用转化器没有问题

image image
2

long的最大值也19位,使用转化器没有问题 image image

xlsx格式的话,我用我截图那个转换器是没问题的,csv就不行

6

你可以试试我的写法,我的写法没有问题

3

你可以试试我的写法,我的写法没有问题

咋俩的写法没啥区别呀

8

我用的就是csv,user.csv

8

我用的就是csv,user.csv

你确定?我看你截图的表头还有xlsx的表头格式,而且我也试过你的这个转换器 image image

8

long的最大值也19位,使用转化器没有问题 image image

xlsx格式的话,我用我截图那个转换器是没问题的,csv就不行

你看看你的第二张图片的表头是不是有阴影,csv是没有的

1

我搞错了,csv不支持对数据类型进行定义,所以走不了covert

嗯,你们可以考虑下csv也支持covert,或者加个配置,csv这种大于15位的数字(我们明确不需要参与计算)直接转为字符串来导出

3

这个是csv本身不支持,csv只支持数字和字符串,准确的是数字字符串和普通字符串,无法显式标注字符串还是数字,所有这个无法实现的

有解决方式的吧,比如在前面加个 “`” 符号,或者后面加个 \t 如图所示,这个就是csv,我用hutool的csv工具类导出的 image

6

看了一下hutool的api,其对于csv的写入都是处理成字符串写入的,而且也不能标识数据是字符串或者数字

是的,老项目用的easy excel的2.0版本,不支持csv,就用的hutool的工具类,将数据转成字符串(大于15为的Long在末尾加 '\t')来写入的,新项目用easy excel的3.0版本,写入文件不想excel那样利索了,目前还是把老项目的hutool封装的方法拿来用的。

3

我测试了一下hutool的,没有发现采用\t的,如果加了\t,数字字符串就变成了字符串了,准确来说数据都变了

好吧,那算了吧,我还是用目前hutool的这个 但是你们也可以考虑csv的写入把convert加上或者加个配置支持这种长度的长整型数据转字符串写入 我也看过issue有人需求和我一样,明确数据不参与计算,只是显示作用,而目前你们的框架导出csv后在wps软件打开时会出现后几位数据精度丢失(这种情况数据直接无用更不用说参与计算了)和显示为科学计数法情况

4

这个csv是规范已经定义如此,不能框架的问题,对xls,xlsx可以显示去设置类型的,框架通过coverter就够可以实现功能,数据丢失的情况是wps或者office本身对数字识别科学记数法导致的,不是框架的问题,采用poi也是如此