需求:
在用easyExcel导出报表时,碰到需要将数据转换为数值or货币格式的需求
过程:
1.首先采取转换器的形式
@Override
public CellData convertToExcelData(BigDecimal bigDecimal, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
if (ObjectUtils.isEmpty(bigDecimal)) {
bigDecimal=BigDecimal.ZERO;
}
CellData cellData = new CellData(new DecimalFormat("#,##0.00").format(bigDecimal.setScale(2)));
return cellData;
}
发现生成的excel依旧是常规格式
2.采用@NumberFormat注解,依旧不行
3.修改转换器为
@Override
public CellData convertToExcelData(BigDecimal bigDecimal, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
if (ObjectUtils.isEmpty(bigDecimal)) {
bigDecimal=BigDecimal.ZERO;
}
CellData cellData = new CellData(CellDataTypeEnum.NUMBER );
cellData.setDataFormatString("##,##0.00");
cellData.setNumberValue(bigDecimal);
return cellData;
}
按理说应该可以了,可依旧不行,并且连千位分隔符也不见了
查看源码
发现是数据的格式转换只支持在读的时候
解决:
因为EasyExcel底层也是poi,所以可以用poi的格式转换来实现
if (!isHead && relativeRowIndex < list.size()&& head.getFieldName().equals("sjje")) {
if (ObjectUtils.isEmpty(cacheCellStyle.get("numberCellStyle"))) {
CellStyle cellStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle();
DataFormat dataFormat = writeSheetHolder.getSheet().getWorkbook().createDataFormat();
cellStyle.setDataFormat(dataFormat.getFormat("#,##0.00"));
cacheCellStyle.put("numberCellStyle", cellStyle);
}
cell.setCellType(CellType.NUMERIC);
cell.setCellStyle(cacheCellStyle.get("numberCellStyle"));
}
成功转换
over