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

按照人们阅读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.kler.cn/a/460313.html

相关文章:

  • 华为OD机试真题---服务器广播
  • Redis的生态系统和社区支持
  • stm32 智能语音电梯系统
  • 【QT】实现RestFul接口
  • ensp QOS的配置
  • Android 系统 ActivityManager 系统层深度定制
  • 头歌实训数据结构与算法-二叉树及其应用(第9关:二叉树的顺序存储及基本操作)
  • 云电脑市场正在爆发!2025新风口出现了?
  • 【QT】QT 的窗口坐标 信号与槽
  • opencv实现KNN算法识别图片数字
  • 网络基础入门到深入(3):网络协议-HTTP/S
  • 时间序列预测算法---LSTM
  • 网络爬虫性能提升:requests.Session的会话持久化策略
  • HTML——38.Span标签和字符实体
  • 优秀的 Verilog/FPGA开源项目介绍(十七)- AXI
  • 【翻译】优化加速像素着色器执行的方法
  • 打印进度条
  • CentOS系统的安装配置
  • 互联网路由架构
  • Spring源码分析之SpringBoot的自动配置和ComponentScan
  • 【嵌入式硬件】直流电机驱动相关
  • gitlab-runner的卸载与安装
  • 蓝桥杯(Java)(ing)
  • 数据资产试点开启,CES Asia 2025聚焦智慧城市新发展
  • 网络爬虫的详细步骤及实现方法
  • FreeRTOS: 优先级翻转的典型场景