package com.ruoyi.common.easyExcel; import cn.hutool.core.util.NumberUtil; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; import com.alibaba.excel.write.metadata.holder.WriteTableHolder; import com.alibaba.excel.write.metadata.style.WriteCellStyle; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFClientAnchor; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import java.lang.reflect.Field; import java.util.List; import java.util.Map; public class CommentWriteHandler implements CellWriteHandler { private final List dataList; private final Map warnToTargetFieldMap; private final Map warnMessages; public CommentWriteHandler(List dataList, Map warnToTargetFieldMap, Map warnMessages) { this.dataList = dataList; this.warnToTargetFieldMap = warnToTargetFieldMap; this.warnMessages = warnMessages; } @Override public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { if (isHead) return; String fieldName = head.getFieldName(); T rowData = dataList.get(relativeRowIndex); for (Map.Entry entry : warnToTargetFieldMap.entrySet()) { String warnField = entry.getKey(); String targetField = entry.getValue(); if (!fieldName.equals(targetField)) continue; try { Field warn = rowData.getClass().getDeclaredField(warnField); warn.setAccessible(true); Object warnValue = warn.get(rowData); if (NumberUtil.parseInt(warnValue.toString()) == 1) { // ✅ 设置背景色通过 WriteCellData 实现 if (cellDataList != null && !cellDataList.isEmpty()) { WriteCellStyle style = new WriteCellStyle(); style.setFillForegroundColor(IndexedColors.RED.getIndex()); style.setFillPatternType(FillPatternType.SOLID_FOREGROUND); cellDataList.get(0).setWriteCellStyle(style); } // 获取现有的批注 Comment existingComment = cell.getCellComment(); String existingText = ""; if (existingComment != null) { // 获取已有批注的内容 existingText = existingComment.getString().getString(); } // 追加新的批注内容 String newCommentText = warnMessages.getOrDefault(warnField, "数据异常,请核查"); String updatedCommentText = existingText + "\n" + newCommentText; // 如果已有批注,则更新批注内容;如果没有,则创建一个新的批注 if (existingComment != null) { existingComment.setString(new XSSFRichTextString(updatedCommentText)); } else { // 创建新的批注并设置内容 Drawing drawing = cell.getSheet().createDrawingPatriarch(); Comment comment = drawing.createCellComment(new XSSFClientAnchor( 0, 0, 0, 0, cell.getColumnIndex(), cell.getRowIndex(), cell.getColumnIndex() + 3, cell.getRowIndex() + 2 )); comment.setString(new XSSFRichTextString(updatedCommentText)); comment.setAuthor("系统提示"); cell.setCellComment(comment); } } } catch (Exception e) { e.printStackTrace(); } } } }