若依管理系统中扩展Execl导出,实现导出金额格式化

若依管理系统中扩展Execl导出,实现导出金额格式化

闲暇时间,帮朋友做了一个简单的管理系统,考虑到功能简单,就选择了最原始的RuoYi项目,没有选在什么RuoYi PlusRuoYi Pro这些功能能多更全面的开源项目。在这个系统中的某些模块会涉及到金额,朋友希望在前端及导出的Execl中都能按金额格式显示。

前端金额格式化

在前端界面将数字按金额格式展示很简单,因为若依给我们提供了numberFormat方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* [number_format 参数说明:]
* @param {[type]} number [number:要格式化的数字]
* @param {[type]} decimals [decimals:保留几位小数]
* @param {[type]} dec_point [dec_point:小数点符号]
* @param {[type]} thousands_sep [thousands_sep:千分位符号]
* @param {[type]} roundtag [roundtag:舍入参数,默认 "ceil" 向上取,"floor"向下取,"round" 四舍五入]
* @return {[type]} [description]
*
*/
export function numberFormat(number, decimals, dec_point, thousands_sep, roundtag) {
number = (number + '').replace(/[^0-9+-Ee.]/g, '');
decimals = decimals || 2;
dec_point = dec_point || ".";
thousands_sep = thousands_sep || ",";
roundtag = roundtag || "round"; //"ceil","floor","round"
var n = !isFinite(+number) ? 0 : +number,
prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
s = '',
toFixedFix = function(n, prec) {
var k = Math.pow(10, prec);
return '' + parseFloat(Math[roundtag](parseFloat((n * k).toFixed(prec * 2))).toFixed(prec * 2)) / k;
};
s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
var re = /(-?\d+)(\d{3})/;
while (re.test(s[0])) {
s[0] = s[0].replace(re, "$1" + sep + "$2");
}
if ((s[1] || '').length < prec) {
s[1] = s[1] || '';
s[1] += new Array(prec - s[1].length + 1).join('0');
}
return s.join(dec);
}

该方法能很好处理好金额格式的展示。在需要格式化的地方直接调用即可,如:

1
numberFormat(scope.row.amount) 

后端导出

  1. Excel注解中添加一个numberFormat的属性

    1
    2
    3
    4
    /**
    * 数字类型格式
    */
    public String numberFormat() default "";
  2. ExcelUtilsetCellVoColumnType.NUMERIC的代码段中加入数字格式化的逻辑

1
2
3
4
5
6
7
8
9
if (StringUtils.isNotNull(value)) {
if (StringUtils.isNotEmpty(attr.numberFormat())) {
CellStyle numberCellStyle = this.wb.createCellStyle();
DataFormat dataFormat = this.wb.createDataFormat();
numberCellStyle.setDataFormat(dataFormat.getFormat(attr.numberFormat()));
cell.setCellStyle(numberCellStyle);
}
cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value));
}

3.在需要格式化的属性上添加注解

1
2
@Excel(name = "余额",numberFormat = "#,##0.00",cellType = Excel.ColumnType.NUMERIC)
private BigDecimal acctBalance;

在POI(Apache POI)中,DataFormat 类型有很多。以下列一些常见部分自定义 DataFormat 类型的示例:

  1. General (0):默认格式,将数据视为文本。
  2. 0:显示数值,并将未填充的位显示为零(例如:1, 2, 3…)。
  3. 0.00:显示数字,保留两位小数,将未填充的位显示为零(例如:1.23, 2.45…)。
  4. #,##0:显示数字,使用逗号作为千位分隔符(例如:1,000, 10,000…)。
  5. #,##0.00:显示数字,使用逗号作为千位分隔符,保留两位小数(例如:1,000.23, 10,000.45…)。
  6. #,##0.00_);Red:显示负数为红色括号,并以货币格式显示(例如:$1,234.56, ($1,234.56))。
  7. 0%:显示数字乘以100,并加上百分号(例如:10%)。
  8. 0.00E+00:以科学计数法显示数字例如:1.23E+05, 2.45E-02…)。
  9. d/m/yy or m/d/yy:以日期格式显示。
  10. dd/mm/yyyy hh:mm:以日期和时间格式显示。
  11. yy-mm-dd:以短年份、月份和日期格式显示。
  12. h:mm AM/PM:以小时:分钟和AM/PM表示的时间格式显示。
  13. [$-F400]h:mm:ss AM/PM:以小时:分钟:秒和AM/PM表示的时间格式显示。
  14. [$-409]yyyy-mm-dd hh:mm:ss:以完整年份、月份、日期、小时、分钟和秒格式显示。

POI还提供了更多其他的DataFormat类型,可以根据具体需求去创建自定义的DataFormat类型。需要注意的是,某些特定的DataFormat类型可能需要使用特殊的语言代码标识,这就需要参考Apache POI文档或其他资源来了解更多详情。

若依管理系统中扩展Execl导出,实现导出金额格式化

https://blogs.52fx.biz/posts/2970755604.html

作者

eyiadmin

发布于

2023-07-28

更新于

2024-05-31

许可协议

评论