byte[] bytes = EasyExcelUtil.writeByBytes(HCExceptionExcelDTO.class, hcExceptionExcelDTOList, new AbstractColumnWidthStyleStrategy() {
@Override
protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) {
boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
if (needSetWidth) {
Sheet sheet = writeSheetHolder.getSheet();
sheet.setColumnWidth(0, 8000);
}
}
@Override
public void afterCellDispose(CellWriteHandlerContext context) {
if (BooleanUtils.isNotTrue(context.getHead())) {
//获取表头信息
List<String> headNameList = context.getHeadData().getHeadNameList();
String headName = headNameList.get(0);
//判断表头信息是否是 1~12月
if (!ArrayUtil.containsAny(MonthUtil.getStringMonthArray(), headName)) {
return;
}
// 单元格
Cell cell = context.getCell();
try {
// 获取单元格的值
String stringCellValue = cell.getStringCellValue();
if (!CheckUtil.isNumber(stringCellValue)) {
return;
}
Number number = NumberUtil.parseNumber(stringCellValue);
int i = number.intValue();
// 如果大于等于0就不处理,小于零才设置样式
if (i >= 0) {
return;
}
} catch (NumberFormatException e) {
// 正常情况下,这儿不会解析失败,如果解析失败了, 就不进行样式渲染,直接返回false
log.error("参数解释失败 : ", e);
return;
}
Workbook workbook = context.getWriteWorkbookHolder().getWorkbook();
// 这里千万记住 想办法能复用的地方把他缓存起来 一个表格最多创建6W个样式 , 不同单元格尽量传同一个 cellStyle
CellStyle cellStyle = workbook.createCellStyle();
Font writeFont = workbook.createFont();
//字体设置成红色
writeFont.setColor(IndexedColors.RED.getIndex());
cellStyle.setFont(writeFont);
cell.setCellStyle(cellStyle);
// 由于这里没有指定dataformat 最后展示的数据 格式可能会不太正确
// 这里要把 WriteCellData的样式清空, 不然后面还有一个拦截器 FillStyleCellWriteHandler 默认会将 WriteCellStyle 设置到
// cell里面去 会导致自己设置的不一样
context.getFirstCellData().setWriteCellStyle(null);
}
}
});
EasyExcelUtil:
/**
* @param clazz EasyExcel实体类的class
* @param dataList 使用默认样式
* @param writeHandler 组定义样式
*/
public static byte[] writeByBytes(Class clazz, List dataList, AbstractColumnWidthStyleStrategy writeHandler) {
byte[] bytes;
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();) {
ExcelWriterBuilder write = EasyExcel.write(byteArrayOutputStream, clazz);
if (CheckUtil.isNotNull(writeHandler)) {
write.registerWriteHandler(writeHandler);
}
write.sheet("Sheet1").doWrite(dataList);
bytes = byteArrayOutputStream.toByteArray();
} catch (IOException e) {
log.error("writeByBytes 报错: ", e);
throw new RuntimeException("系统异常");
}
return bytes;
}