EasyExcel读写数字类型数据丢失精度解决方案

问题背景

我们项目有个场景是上传excel文件,上传的文档中有保留两位小数的数字格式,上传之后的数据会经过处理后在写入另一个文档。如果用String去读写,会保留精度,但读文件的时候只能读格式化之后的数字。如果用BigDecimal去读写,能读到真实的数字,但在处理之后写入excel时有可能会丢失精度。
如果用BigDecimal去读,String写入,可以解决这个问题,但涉及大量的dto copy,影响效率。下面我们来看看demo演示。

demo演示

  • 代码如下
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.
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,了解您的要求。关于easyexcel读写,可以参考以下步骤: 1. 引入依赖 ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.10</version> </dependency> ``` 2. 写入Excel文件 ```java // 创建Excel对应的实体对象 public class DemoData { @ExcelProperty("姓名") private String name; @ExcelProperty("年龄") private Integer age; } // 写入Excel public void writeExcel() { // 文件输出位置 String fileName = "demo.xlsx"; // 写法1 EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(dataList); // 写法2 ExcelWriter excelWriter = null; try { excelWriter = EasyExcel.write(fileName, DemoData.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet("模板").build(); excelWriter.write(dataList, writeSheet); } finally { if (excelWriter != null) { excelWriter.finish(); } } } ``` 3. 读取Excel文件 ```java // 读取Excel public void readExcel() { // 文件路径 String fileName = "demo.xlsx"; // 读取sheet1内容 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); // 读取所有sheet内容 EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll(); } // 读取监听器 public class DemoDataListener extends AnalysisEventListener<DemoData> { private List<DemoData> dataList = new ArrayList<>(); @Override public void invoke(DemoData data, AnalysisContext context) { // 读取到一条数据时执行 dataList.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 读取完成后执行 // 可以将dataList进行保存操作 } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小飞侠fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值