使用easyexcel做数据校验错误返回excel表格批注+背景
效果入这样
想要实现,每行错误单元格,写入错误批注还是很难得,因为easyexcel在2.2.0.bate1 版本才支持写入批注. 所有还没研究能不能实现.
现在按照模板只能实现了单个(又研究了下是可以批量的)
package com.alibaba.easyexcel.test.demo.write;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import com.alibaba.excel.write.handler.AbstractRowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
/**
采用的是官方文档demo更改而成* 自定义拦截器.新增注释,第一行头加批注** @author Mr chen*/
public class CommentWriteHandler extends AbstractRowWriteHandler {@Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Integer relativeRowIndex, Boolean isHead) {//如果false 就读取行数据. 如果为true只能批注头.不能对每行进行批注if (!isHead) {Sheet sheet = writeSheetHolder.getSheet();//循环是设置批量批示的for (int i = 0; i < 2; i++) {Workbook workbook = sheet.getWorkbook();//只能创建实例才能对单元格进行操作.阿里暂时不支持CellStyle cellStyle = workbook.createCellStyle();//设置前景填充样式cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设置前景色为红色cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());//设置垂直居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();// 在第一行 第二列创建一个批注Comment comment =drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short)3, 3, (short)5, 6));// 输入批注信息comment.setString(new XSSFRichTextString("创建批注1!"));// 将批注添加到单元格对象中sheet.getRow(relativeRowIndex+1).getCell(i).setCellComment(comment);sheet.getRow(relativeRowIndex+1).getCell(i).setCellStyle(cellStyle);}}}
}
设置成这样子
可以根据业务来对每行数据进行校验 返回错误批注 (根据业务来处理)
后续会继续完善整套的代码.思路先搞通在说
下面是对单元格的样式 保存下以后可查看方便
CellStyle cellStyle = workbook.createCellStyle();
// 下边框
cellStyle.setBorderBottom(BorderStyle.THIN);
// 左边框
cellStyle.setBorderLeft(BorderStyle.THIN);
// 上边框
cellStyle.setBorderTop(BorderStyle.THIN);
// 右边框
cellStyle.setBorderRight(BorderStyle.THIN);
// 水平对齐方式
cellStyle.setAlignment(HorizontalAlignment.CENTER);
//cellStyle.setFillForegroundColor(IndexedColors.BLUE.getIndex());
// 垂直对齐方式
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);