EasyExcel使用导出模版后在CellWriteHandler的afterCellDispose方法设置 CellStyle失效问题解决方法
问题描述:excel 模版塞入数据后,需要设置单元格的个性化设置时失效,本文以设置数据格式为例(设置列的数据展示时需要加上千分位分隔符)
1. 无效的解决方案:
在afterCellDispose中通过重新设置 cell 的 CellStyle 来设置 DataFormat,此时可以打印 cell的值和 DataFormat 发现与我们设置的一样,但是导出时就是没有生效。
注意:由于我使用了 easyexcel 中的横向填充数据,所以我将数据全部设置为 String 对应 Excel 中的 String,在下面代码中我删除了部分定制化的逻辑,仅仅只展示如何为本质是 Number的String数据加上DataFormat。
@Slf4j
public class SignAmtCustTypeMergeStrategy implements CellWriteHandler {
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
if (cellType == CellType.STRING) {
String stringCellValue = cell.getStringCellValue();
if (StringUtils.isNotEmpty(stringCellValue)) {
try {
Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
CellStyle newStyle = workbook.createCellStyle();
CellStyle originalStyle = cell.getCellStyle();
if (originalStyle != null) {
newStyle.cloneStyleFrom(originalStyle);
}
newStyle.setDataFormat(IntegerEnum.FOUR.getValue().shortValue());
cell.setCellStyle(newStyle);
BigDecimal bigDecimal = new BigDecimal(stringCellValue);
cell.setCellValue(bigDecimal.doubleValue());
} catch (Exception e){
}
}
}
}
}
2. 解决方案:
在执行writeCellData.setWriteCellStyle(writeCellStyle);
前后可以对比下面的区别writeCellStyle
- 具体的区别见下图:index=4代表的是
BuiltinFormats的 "#,##0.00",
格式。
@Slf4j
public class SignAmtCustTypeMergeStrategy implements CellWriteHandler {
@Override
public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
if (cellType == CellType.STRING) {
String stringCellValue = cell.getStringCellValue();
if (StringUtils.isNotEmpty(stringCellValue)) {
try {
BigDecimal bigDecimal = new BigDecimal(stringCellValue);
cell.setCellValue(bigDecimal.doubleValue());
if (!cellDataList.isEmpty()) {
WriteCellData<?> writeCellData = cellDataList.get(0);
WriteCellStyle writeCellStyle = new WriteCellStyle();
DataFormatData dataFormatData = new DataFormatData();
dataFormatData.setIndex(IntegerEnum.FOUR.getValue().shortValue());
writeCellStyle.setDataFormatData(dataFormatData);
writeCellData.setWriteCellStyle(writeCellStyle);
}
} catch (Exception e){
}
}
}
}
}
注意:如果你在执行前你的 cell 数据就是 Number 则不需要执行
BigDecimal bigDecimal = new BigDecimal(stringCellValue); cell.setCellValue(bigDecimal.doubleValue());
这两行逻辑,如果你想让 String 转 Number并设置DataFormat 则需要设置这段,具体原因还不太清楚,但是不设置DataFormat设置会失败。(有懂得友友可以评论下~~~)