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 {@Overridepublic 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 {@Overridepublic 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設置會失敗。(有懂得友友可以評論下~~~)