使用easyexcel做数据校验错误返回excel表格批注+背景

使用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 {
    @Override
    public 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);

可以使用 EasyExcel 的监听器来实现这个功能。在读取 Excel 文件时,监听器会在读取每一行数据时触发,我们可以在监听器中对每一行数据进行校验,并将错误数据标记为红色。 具体步骤如下: 1. 定义一个实体类来存储 Excel 中的数据,同时在类中添加一个字段用来存储错误信息。 2. 创建一个继承自 AnalysisEventListener 的监听器类,并重写其中的 invoke 方法。在 invoke 方法中,我们可以对每一行数据进行校验,并将错误信息保存到实体类的错误信息字段中。 3. 在读取 Excel 文件时,通过 read 方法读取数据并传入监听器。在监听器中,可以通过 ExcelRowAnalysisResult 对象获取到当前行的数据,可以通过反射将数据赋值给实体类。 4. 在将数据保存到数据库或者其他地方时,可以根据实体类的错误信息字段来判断数据是否合法,如果不合法则将该行数据标记为红色。 下面是一个示例代码: ```java @Data public class ExcelData { private String name; private Integer age; private String error; // 错误信息 } public class ExcelListener extends AnalysisEventListener<ExcelData> { private List<ExcelData> dataList = new ArrayList<>(); @Override public void invoke(ExcelData data, AnalysisContext context) { // 对每一行数据进行校验,将错误信息保存到实体类的 error 字段中 if (StringUtils.isBlank(data.getName())) { data.setError("姓名不能为空"); } if (data.getAge() == null || data.getAge() < 0) { data.setError("年龄不合法"); } dataList.add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 所有数据解析完成后的回调方法 } public List<ExcelData> getDataList() { return dataList; } } public void readExcel(String filePath) throws Exception { ExcelListener listener = new ExcelListener(); EasyExcel.read(filePath, ExcelData.class, listener).sheet().doRead(); List<ExcelData> dataList = listener.getDataList(); for (ExcelData data : dataList) { if (StringUtils.isNotBlank(data.getError())) { // 将错误数据标记为红色 // ... } } } ``` 在上面的示例代码中,我们定义了一个 ExcelData 类来存储 Excel 中的数据,其中包含了一个 error 字段用来存储错误信息。同时,我们创建了一个 ExcelListener 类来作为监听器,在 invoke 方法中对每一行数据进行校验,并将错误信息保存到实体类的 error 字段中。在读取 Excel 文件时,我们通过 read 方法读取数据并传入监听器,然后通过 getDataList 方法获取到所有的数据,遍历 dataList,如果发现某一行数据error 字段不为空,则将该行数据标记为红色。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值