当前位置: 首页 > news >正文

按照人们阅读Excel习惯来格式化BigDecimal

1、环境/问题描述

使用springboot发送邮件(附件)的方式将月度报表发送给领导查阅,数据是准确的,领导基本满意。

就是对一些数字的格式化提出了改进建议,比如不要让大数字自动转为科学计数法、浮点数小数点后都是0就不要带出来,根据某列的数值(0-100之间)设置单元格的底色,小于60的标深红色、大于等于60小于70标浅红色,大于等于70小于等于80标浅绿色,大于等于80小于90标中绿色,大于等于90的标深绿色。

2、分析/排查问题

1) 科学计算法的问题

经常,发现数字的长度超过8位Excel才会将次单元格中的值进行科学计算法转换,解决办法就是判断数字的长度,然后设置单元格存储的值类型

2) 浮点数小数点后都是0就不要带出来

数据表中的字段类型设置的是decimal(12,4),存储的值就是预期值,无小数位的就是证书、带小数位的小数位必定不全为0,只是通过mybatis-plus读取出来映射到Java Bean时自动将数字格式化为必定带4位小数,小数位无值则用0填充了

3) 根据某列的数值(0-100之间)设置单元格的底色

可以根据该单元格的数值大小根据规则进行设置色值,通过poi提供的方式给单元格设置底色

3、解决问题

1) 科学计算法的问题
String s = o.toString();
// 当数字类型长度超过8位时,改为字符串类型显示(Excel数字超过一定长度会显示为科学计数法)
if ( isNumeric( o ) && s.length() < 8 ) {cell.setCellType( CellType.NUMERIC );cell.setCellValue( Double.parseDouble( s ) );return CELL_OTHER;
} else {cell.setCellType( CellType.STRING );cell.setCellValue( s );
}
2) 浮点数小数点后都是0就不要带出来
public class BigDecimalFormatter {public static String format(BigDecimal number) {return format(number,5);}/*** 格式化BigDecimal* @param number 要处理的数字* @param newScale 保留的小数位* @return*/public static String format(BigDecimal number,int newScale) {// 设置小数点后最多保留位位数(可以根据需要调整),并四舍五入BigDecimal formatted = number.setScale(newScale, RoundingMode.HALF_UP);// 再次移除尾随的零BigDecimal stripped = formatted.stripTrailingZeros();// 如果 scale 是负数或 0,则说明没有小数部分if (stripped.scale() <= 0) {return stripped.toBigInteger().toString(); // 返回整数部分} else {return stripped.toString(); // 包含小数部分}}public static String format2(BigDecimal number) {return number.stripTrailingZeros().toPlainString();}public static void main(String[] args) {System.out.println(format(new BigDecimal("123.000")));System.out.println(format(new BigDecimal("123.456")));System.out.println(format(new BigDecimal("123.00100")));System.out.println(format2(new BigDecimal("123.000")));System.out.println(format2(new BigDecimal("123.456")));System.out.println(format2(new BigDecimal("123.00100")));}
}
/*** 输出以下内容格式123
123.456
123.001
123
123.456
123.001*/
3) 根据某列的数值(0-100之间)设置单元格的底色
String hexColorStr = "十六进制色值";
XSSFColor xssfColor = new XSSFColor();
xssfColor.setARGBHex( hexColorStr );
cellStyle.setFillForegroundColor( xssfColor );
cellStyle.setFillBackgroundColor( xssfColor );
cellStyle.setFillPattern( FillPatternType.SOLID_FOREGROUND );
// 设置样式
cell.setCellStyle( cellStyle );

至此,问题得到解决,此处记录一下

http://www.lryc.cn/news/514060.html

相关文章:

  • IDEA开发Java应用的初始化设置
  • Java网络套接字
  • 2025差旅平台推荐:一体化降本30%
  • 多个DataV遍历生成
  • mysql_real_connect的概念和使用案例
  • Python性能分析深度解析:从`cProfile`到`line_profiler`的优化之路
  • Momentum Contrast for Unsupervised Visual Representation Learning论文笔记
  • 用户界面的UML建模07
  • Node.js中使用Joi 和 express-joi-validation进行数据验证和校验
  • InstructGPT:基于人类反馈训练语言模型遵从指令的能力
  • jrc水体分类对水体二值掩码修正
  • 营销/CDP/MA/SCRM
  • 免费CDN加速,零成本提升网站速度!
  • 2024-12-29-sklearn学习(25)无监督学习-神经网络模型(无监督) 烟笼寒水月笼沙,夜泊秦淮近酒家。
  • RSA e与phi不互质(AMM算法进行有限域开根)
  • 网络物理互连
  • 论文研读:Text2Video-Zero 无需微调,仅改动<文生图模型>推理函数实现文生视频(Arxiv 2023-03-23)
  • 服务端错误的处理和web安全检测
  • 鸿蒙TCPSocket通信模拟智能家居模拟案例
  • SQL-leetcode-197. 上升的温度
  • C++系列关键字static
  • 使用Fn Connect之后,如何访问到其他程序页面?原来一直都可以!
  • 探索Composable Architecture:小众但高效的现代框架技术
  • 改投论文时如何重构
  • P8打卡——YOLOv5-C3模块实现天气识别
  • 基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)
  • PyTorch快速入门教程【小土堆】之完整模型训练套路
  • 【AIGC】 ChatGPT实战教程:如何高效撰写学术论文引言
  • TTL 传输中过期问题定位
  • 非docker方式部署openwebui过程记录