EasyExcel写数字格式数据默认为科学计数法解决方案

news2024/12/25 22:09:21

问题背景

我们项目有个场景是excel下载,需要将数字类型的数据由字符格式转化为数字格式,但由于数字较长,利用easyExcel写入文件后,数字类型会默认展示为科学计数法。下面我们来看看demo演示。

demo演示

  • 准备以下代码
public class Test7 {
    public static void main(String[] args) {
        List<DemoData> list = new ArrayList<>();
        DemoData data = new DemoData();
        data.setCol1("test");
        data.setCol2(new BigDecimal("1234567891.1"));
        list.add(data);
        List<DemoData1> result = new ArrayList<>();
        DemoData1 data1 = new DemoData1();
        data1.setCol1("test");
        data1.setCol2("1234567891.1");
        result.add(data1);

        //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;
    }
}

执行结果说明

case1执行结果如下图
请添加图片描述

case2执行结果如下图
请添加图片描述

case1是满足了我们的需求,单元格转为了数字格式,但显示为科学计数法,case2数据展示是正确的,但单元格是字符的格式,不满足原始的需求,
这时候也许有人说了,为了保证数据展示的准确性,还是应该用字符展示,我们提出来这个需求也是有原因的,因为业务方会拿数据验数,如果系统自动转数字格式,
那就减少了业务手工转数字格式的步骤。因此,为了解决这个问题,我们需要去探索第三种解。

解决方案

对此,经过源码研究,我发现可以用BigDecimal类型去写数字,只需要在对应字段上添加注解**@ContentStyle(dataFormat = 2)** 或者@NumberFormat(“0.00”)
,添加注解之后读取数据截图如下,可以正常展示长数字格式。
请添加图片描述

在@ContentStyle注解中还有其他单元格格式使用方式,可自行探索,而dataFormat也有好几种格式可设置,代码如下,包含了大量的excel单元格格式。

 private static final String[] _formats = new String[]{"General", "0", "0.00", "#,##0", "#,##0.00", "\"$\"#,##0_);(\"$\"#,##0)", "\"$\"#,##0_);[Red](\"$\"#,##0)", "\"$\"#,##0.00_);(\"$\"#,##0.00)", "\"$\"#,##0.00_);[Red](\"$\"#,##0.00)", "0%", "0.00%", "0.00E+00", "# ?/?", "# ??/??", "m/d/yy", "d-mmm-yy", "d-mmm", "mmm-yy", "h:mm AM/PM", "h:mm:ss AM/PM", "h:mm", "h:mm:ss", "m/d/yy h:mm", "reserved-0x17", "reserved-0x18", "reserved-0x19", "reserved-0x1A", "reserved-0x1B", "reserved-0x1C", "reserved-0x1D", "reserved-0x1E", "reserved-0x1F", "reserved-0x20", "reserved-0x21", "reserved-0x22", "reserved-0x23", "reserved-0x24", "#,##0_);(#,##0)", "#,##0_);[Red](#,##0)", "#,##0.00_);(#,##0.00)", "#,##0.00_);[Red](#,##0.00)", "_(* #,##0_);_(* (#,##0);_(* \"-\"_);_(@_)", "_(\"$\"* #,##0_);_(\"$\"* (#,##0);_(\"$\"* \"-\"_);_(@_)", "_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)", "_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)", "mm:ss", "[h]:mm:ss", "mm:ss.0", "##0.0E+0", "@"};

源码展现

能这样实现,主要是在如下源码处com.alibaba.excel.converters.bigdecimal.BigDecimalNumberConverter#convertToExcelData
如果发现有@NumberFormat,则会按此来格式化数据。

 public WriteCellData<?> convertToExcelData(BigDecimal value, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) {
        return NumberUtils.formatToCellData(value, contentProperty);
    }

深入看看formatToCellData方法,如果设置了NumberFormat属性,则会按指定格式来格式化数据。

    public static WriteCellData<?> formatToCellData(Number num, ExcelContentProperty contentProperty) {
        WriteCellData<?> cellData = new WriteCellData<>(new BigDecimal(num.toString()));
        if (contentProperty != null && contentProperty.getNumberFormatProperty() != null
            && StringUtils.isNotBlank(contentProperty.getNumberFormatProperty().getFormat())) {
            WorkBookUtil.fillDataFormat(cellData, contentProperty.getNumberFormatProperty().getFormat(), null);
        }
        return cellData;
    }

总结

在使用easyExcel写长数字格式数据时

  • 用BigDecimal写,且在字段上添加@ContentStyle注解,能解决数字格式问题,但会覆盖excel表头格式。❌
  • 用BigDecimal写,且在字段上添加@NumberFormat注解,完美解决数字格式展示问题。✅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/138582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2015-2022机器人方向课程教学评价成绩和任务汇总

←机器人工程或机器人方向毕业设计汇总篇→↓2022↑https://zhangrelay.blog.csdn.net/article/details/124856849ROS机器人程序设计课程反思-2022终篇-https://blog.csdn.net/ZhangRelay/article/details/127295957由于系统更新&#xff0c;分为两个部分2015-20182018-2022学生…

2023首场CSDN直播丨顶象邀您共话验证码顶层能力设计

1.12 15:00 验证码技术解析——业务安全大讲堂直播https://live.csdn.net/room/dingxiangtech/gqzj6MEr “我不是机器人”本应是不言自明的事情。但随着黑灰产的出现&#xff0c;诈骗行为和刷票行为呈指数级增长。 为了遏制这种现象&#xff0c;第一代验证码出现了。由此也开…

你需要知道的无代码数据分析工具

Nov. 2022, Vincy当今市场上有无数种的无代码分析工具&#xff0c;允许开发人员和非开发人员使用拖放的方式构建图表和仪表盘。此列表涵盖了 4 种针对不同的用例和行业的无代码数据分析工具。这些工具可以帮助用户节省时间并根据数据做出明智的决策。Footprint AnalyticsFootpr…

burp抓包mumu模拟器

1、生成android系统证书 step1:burp导出der证书 step2:生成pem格式证书 openssl x509 -inform DER -in mybpcert.der -out PortSwiggerCA.pem 生成hash并显示 openssl x509 -inform PEM -subject_hash_old -in PortSwiggerCA.pem|head -1 mv PortSwiggerCA.pem 9a5ba575.0…

mysql 存储过程批量删除重复数据

mysql 存储过程批量删除重复数据 表结构&#xff1a; LOAD DATA INFILE /usr/local/phone_imsi_12 replace INTO TABLE tbl_imsi2number_new FIELDS TERMINATED BY \t ENCLOSED BY (number,imsi); 先用SQL语句来进行去重操作&#xff1a; delete from tbl_imsi2number_new …

115.(leaflet之家)leaflet空间判断-点与矩形的空间关系

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

PCBA方案——红外医用额温枪方案

本方案讲述一款国产8位CMOS单芯片ZHW3548开发的额温枪方案&#xff0c;该CMOS芯片内置8K*16bits一次性可编程OTP ROM&#xff08;只能分为4K和4K两次使用&#xff09;&#xff0c;内置256*8bits数据存储器SRAM&#xff0c;一个带有1路全差分模拟信号输入的24位ADC&#xff0c;低…

【LeetCode每日一题】——258.各位相加

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目进阶】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 258.各位相加 四【题目描述】 给…

React(coderwhy)- 01(介绍及基础)

React的介绍&#xff08;技术角度&#xff09; React是什么&#xff1f;React&#xff1a;用于构建用户界面的 JavaScript 库React的官网文档&#xff1a;https://zh-hans.reactjs.org/React的特点&#xff1a; 声明式编程组件化开发多平台适配Hello React react需要3个依赖&am…

最近蛮多应届生问,刚出来怎么找工作,我实在难以启齿......

前言 不知道什么情况&#xff0c;近几个月&#xff0c;好多兄弟朋友有在问我&#xff0c;关于应届生刚出来找工作的事儿。 可以看到标题&#xff0c; ‘难以启齿’ 这四个字大家应该都很少看到了吧。 因为很多兄弟问这个事情&#xff0c;我决定悄悄地发出来&#xff0c;把 我…

域名批量查询 到期未续费域名查询

域名的批量查询&#xff0c;指用户可以一次性输入多个域名进行查询&#xff0c;这样可以节省很多查询时间&#xff0c;例如你需要查询iis7这个关键词相关的域名在全球的注册情况 你完全可以使用域名批量查询工具。 最近入职了一家SEO公司&#xff0c;接手管理了110多个网站&am…

ARM指令

目录 1.指令格式 2.条件&#xff08;cond字段&#xff09; 3.指令助记符 4.寄存器 1.指令格式 基本格式 <opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>} 一共6部分 其中&#xff0c;<>内的项是必须的&#xff0c;{}内的项是可选的&#…

【整型提升问题】

整型提升是什么&#xff1f; 整型提升的规则整型提升的存在 整型提升&#xff1a; 在计算机中&#xff0c;一个数据的类型如果是char 类型&#xff0c;以整型的形式打印该char类型的值时&#xff0c;会自动转换成整型&#xff0c;叫做整型提升。 整型提升的规则&#xff1a…

LeetCode 力扣 2042. 检查句子中的数字是否递增 areNumbersAscending

大家觉得写还可以&#xff0c;可以点赞、收藏、关注一下吧&#xff01; 也可以到我的个人博客参观一下&#xff0c;估计近几年都会一直更新&#xff01;和我做个朋友吧&#xff01;https://motongxue.cn 文章目录2042. 检查句子中的数字是否递增题目描述示例 1&#xff1a;示例…

分享一套微信门户应用管理系统源码 微信公众号平台开发框架源码

微信门户开发框架源码 微信公众号平台开发框架源码 源码分享&#xff0c;需要源码学习可私信我获取。 微信门户应用管理系统&#xff0c;采用基于 MVC Bootstrap Ajax Enterprise Library的技术路线&#xff0c;界面层采用Boostrap Metronic组合的前端框架&#xff0c;数…

新浪l2接口委托撤单是如何用c++实现的?

今天要和大家分享的是新浪l2接口委托撤单&#xff0c;那么接下来小编分享的是它的C实现代码&#xff01; // 委托撤单 // exchangeId: 0>深证(东兴证券是A0, 招商证券普通账户是2) // 1>上证 typedef void (*CancelOrderProc)(int clientId, const char …

录屏怎么录,试试这三个电脑录屏方法

录屏是当前最常用的功能&#xff0c;它可以帮助我们将喜爱的视频片段、线上会议&#xff0c;网络课程以及不能被下载的视频都给录制下来。电脑录屏怎么录&#xff1f;我们可以用电脑自带的录屏工具&#xff0c;或者使用第三方专业的电脑录屏软件来录制。下面小编就给大家分享3个…

2023年机器人与人工智能国际会议(JCRAI 2023)

2023年机器人与人工智能国际会议&#xff08;JCRAI 2023&#xff09; 重要信息 会议网址&#xff1a;www.jcrai.org 会议时间&#xff1a;2023年7月7-9日 召开地点&#xff1a;中国上海 截稿时间&#xff1a;2023年5月20日 录用通知&#xff1a;投稿后2周内 收录检索&am…

异常机制与体系

目录 一、传统的错误处理机制 二、异常概念 三、异常的使用 3.1 抛出与捕获 3.1.1 异常的抛出和匹配原则 3.1.2 在函数调用链中异常栈展开匹配原则 3.2 重新抛出 3.3 异常安全 3.4 异常规范 四、自定义异常体系 五、标准库的异常体系 六、异常的优缺点 6.1 优点 …

第三十三讲:神州三层交换机远程管理

1、三层交换机带外管理&#xff1a; CS6200-28X-EI>ena CS6200-28X-EI#conf CS6200-28X-EI(config)#username dcn privilege 15 password 0 123456 CS6200-28X-EI(config)#enable password 789 CS6200-28X-EI(config)#authentication line console login local CS6200…