Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

数据经过导入-处理-导出后精度丢失 #2595

Closed
chenzhongyu11 opened this issue Jul 17, 2022 · 7 comments
Closed

数据经过导入-处理-导出后精度丢失 #2595

chenzhongyu11 opened this issue Jul 17, 2022 · 7 comments
Labels
help wanted Extra attention is needed

Comments

@chenzhongyu11
Copy link

异常代码

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

建议描述

@chenzhongyu11 chenzhongyu11 added the help wanted Extra attention is needed label Jul 17, 2022
@mymde
Copy link

mymde commented Jul 21, 2022

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

@chenzhongyu11
Copy link
Author

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

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

@mymde
Copy link

mymde commented Jul 22, 2022

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

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

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

@chenzhongyu11
Copy link
Author

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

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

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

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

@mymde
Copy link

mymde commented Jul 23, 2022

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

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

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

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

@chenzhongyu11
Copy link
Author

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

@iambiglee
Copy link

iambiglee commented Dec 5, 2022

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

3 participants