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.
### 使用 EasyExcel 进行数据读写操作 #### 数据流读取示例 为了实现高效的数据处理,EasyExcel 提供了基于监听器模式的流式读取功能。通过这种方式可以逐行解析 Excel 文件中的数据而无需一次性加载整个文件到内存中。 创建自定义监听器来接收每一行的数据: ```java import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; public class DataListener extends AnalysisEventListener<DemoBeanheads> { @Override public void invoke(DemoBeanheads data, AnalysisContext context) { System.out.println(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 所有数据解析完成后的逻辑 } } ``` 使用 `InputStream` 来初始化 `ExcelReader` 并执行读取过程[^2]: ```java import java.io.InputStream; import org.springframework.web.multipart.MultipartFile; // 假设 multipartFile 是上传的 Excel 文件 MultipartFile multipartFile = ... ; try (InputStream inputStream = multipartFile.getInputStream()) { new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null, new DataListener()).read(); } catch (IOException e) { throw new RuntimeException(e); } ``` #### 数据流写入示例 对于大数据量场景下的导出需求,同样推荐采用流的方式来进行写入操作。这有助于减少程序运行期间占用过多内存资源的风险。 编写用于映射表头与实体属性关系的对象 Bean: ```java package com.wkl.testdemo.excel; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @Data public class DemoBeanheads { @ExcelProperty("大学姓名") private String name; @ExcelProperty("大学性别") private String sex; } ``` 利用 `OutputStream` 实现向客户端浏览器发送下载链接的功能[^3]: ```java import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; List<DemoBeanheads> list = new ArrayList<>(); for(int i=0;i<10000;i++){ DemoBeanheads demoBeanhead=new DemoBeanheads(); demoBeanhead.setName("张三"+i); demoBeanhead.setSex(i%2==0?"男":"女"); list.add(demoBeanhead); } EasyExcel.write(response.getOutputStream(),DemoBeanheads.class).sheet("模板").doWrite(list); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小飞侠fly

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

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

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

打赏作者

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

抵扣说明:

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

余额充值