[alibaba/easyexcel]数据经过导入-处理-导出后精度丢失

2024-05-09 160 views
0

异常代码

public class Test5 {
    public static void main(String[] args) {
        String fileName = "g://" + "demo" + File.separator + "demo.xlsx";
        List<DemoData> list = EasyExcel.read(fileName, DemoData.class, null).sheet().doReadSync();
        List<DemoData1> result = new ArrayList<>();
        for(DemoData demoData:list){
            if(demoData.getCol2() != null){
                demoData.setCol2(demoData.getCol2().add(new BigDecimal("500000000000.123456")));

                DemoData1 demoData1= new DemoData1();
                demoData1.setCol1(demoData.getCol1());
                demoData1.setCol2(demoData.getCol2().toString());
                result.add(demoData1);
            }
        }
        //case1
        EasyExcel.write("g://" + "demo" + File.separator + "demoTemp1.xlsx",DemoData.class).sheet().doWrite(list);
        //case2
        EasyExcel.write("g://" + "demo" + File.separator + "demoTemp2.xlsx",DemoData1.class).sheet().doWrite(result);
    }
}
public class DemoData {
    @ExcelProperty("序号")
    private String col1;
    @ExcelProperty("数字1")
    private BigDecimal col2;

    public String getCol1() {
        return col1;
    }

    public void setCol1(String col1) {
        this.col1 = col1;
    }

    public BigDecimal getCol2() {
        return col2;
    }

    public void setCol2(BigDecimal col2) {
        this.col2 = col2;
    }
}
public class DemoData1 {
    @ExcelProperty("序号")
    private String col1;
    @ExcelProperty("数字1")
    private String col2;

    public String getCol1() {
        return col1;
    }

    public void setCol1(String col1) {
        this.col1 = col1;
    }

    public String getCol2() {
        return col2;
    }

    public void setCol2(String col2) {
        this.col2 = col2;
    }
}

异常提示 1、导入文件格式如下图,可以看到展现的值与实际的值不一样,为了读取实际值我采用BigDecimal 去读 image 2、经过处理后,用同样的dto去导出,如下图,可以看到后面精度已丢失 image 3、为了解决这种问题,我采用切换dto的方式,将字段类型换成String去写入,导出结果如下图,可以看到这样结果是对了,但是涉及大量的dto copy,影响效率,而我如果采用String去读的话,又只会读取展现的值,读取的数据会丢失精度,请问对于这种场景有什么好的解决办法么? image

建议描述

回答

1

poi数据类型的单元格是double类型,而其精度是15~16位数字,所以丢了精度

4

poi数据类型的单元格是double类型,而其精度是15~16位数字,所以丢了精度

对的哇,不知道这种场景有什么好的办法

3

poi数据类型的单元格是double类型,而其精度是15~16位数字,所以丢了精度

对的哇,不知道这种场景有什么好的办法

除了变成文本,也不太清楚还有什么奇技淫巧

9

poi数据类型的单元格是double类型,而其精度是15~16位数字,所以丢了精度

对的哇,不知道这种场景有什么好的办法

除了变成文本,也不太清楚还有什么奇技淫巧

大佬你是官方开发人员么,可以帮忙再想想不

6

poi数据类型的单元格是double类型,而其精度是15~16位数字,所以丢了精度

对的哇,不知道这种场景有什么好的办法

除了变成文本,也不太清楚还有什么奇技淫巧

大佬你是官方开发人员么,可以帮忙再想想不 不是,菜鸡一枚

4

太不容易了,研究了好久的源码,终于有了最优解!关闭啦~

8

Chen哥 convertToJavaData 这个方法,只有在读的时候才会用到,写的时候,进不来这个方法,您这边的方案三是否仅仅只是支持读而并不支持写?

如果是使用 @NumberFormat("#,###.##") private String doubleData; 这种写法,代码只会执行到com.alibaba.excel.converters.string.StringStringConverter#convertToExcelData 这里并不会生成千分位的数字