Easyexcel怎么给某一列添加校验

我现在使用的是easyexcel 我想在数据导出的时候,给某一列添加校验,换句话说就是希望在某一列只能输入也就是

img


日期格式的数据,要怎么实现?

需要的大概就是如下功能

img

加上这个注解试试 @JsonFormat(pattern = "yyyyMM")

关于该问题,我找了一篇非常好的本人写的资源示例,你可以看看是否有帮助,链接: 关于Java使用EasyExcel导出动态数据为Excel文件示例

java解析Excel文件并把数据存入数据库和导出数据为excel文件

题主你的问题背景很模糊,不晓得你生成excel是通过什么方式来的,可以详细描述下。

引用new bing作答:
在EasyExcel中给某一列添加校验,可以通过ExcelProperty注解的format属性来指定该列的日期格式,并在生成Excel文件时进行校验。示例代码如下:

@ExcelProperty(value = "日期", index = 1, format = "yyyyMM")
private Date date;

其中,value属性表示该列的表头名称,index属性表示该列的顺序位置,format属性表示该列的日期格式,这里指定为"yyyyMM"。

这样,在导出Excel文件时,该列的数据会自动按照指定的日期格式进行校验和格式化输出。在输入数据时,只能输入符合指定日期格式的数据,否则会提示错误信息。

继承接口ReadListener 然后返回不满足的行信息

该回答引用于ChatGPT:
您好,您可以使用 easyexcel 的 ColumnIndexModel 类型的校验器验证日期格式的数据。

以下是一个示例代码:

// 创建列表头
List<List<String>> head = new ArrayList<>();
head.add(Arrays.asList("姓名", "性别", "生日"));

// 校验器,校验第3列是否为日期格式(yyyy-MM-dd)
Map<Integer, String> verifyMap = new HashMap<>();
verifyMap.put(2, "^((\\d{2}(([02468][048])|([13579][26]))[\\/\\-\\/]?((((0?[13578])|(1[02]))[\\/\\-\\/]?(0?[1-9]|[12]\\d|31))|(((0?[469])|(11))[\\/\\-\\/]?(0?[1-9]|[12]\\d|30))|(0?2[\\/\\-\\/]?((0?[1-9])|(1\\d)|(2[0-8])))|(0?2[\\/\\-\\/]?((29)(?=[02468][048])|((1[6-9]|[2-9]\\d)(?!(?:00)))))$)|(^$)");

// 创建 WriteSheet 对象
WriteSheet sheet = EasyExcel.writerSheet("Sheet1").head(head).build();

// 添加校验器
sheet.setColumnWidth(2, 20);
sheet.setVerifyHandler(new DefaultVerifyHandler());
sheet.setNeedVerify(true);
sheet.setVerifyMap(verifyMap);

// 写入数据
EasyExcel.write("example.xlsx")
        .registerConverter(new LocalDateNumberConverter()) // 日期转换
        .sheet().doWrite(data);

其中 verifyMap 指定第3列需要校验日期格式,正则表达式 ^((\\d{2}(([02468][048])|([13579][26]))[\\/\\-\\/]?((((0?[13578])|(1[02]))[\\/\\-\\/]?(0?[1-9]|[12]\\d|31))|(((0?[469])|(11))[\\/\\-\\/]?(0?[1-9]|[12]\\d|30))|(0?2[\\/\\-\\/]?((0?[1-9])|(1\\d)|(2[0-8])))|(0?2[\\/\\-\\/]?((29)(?=[02468][048])|((1[6-9]|[2-9]\\d)(?!(?:00)))))$)|(^$) 验证日期格式为 yyyy-MM-dd。

请注意,在使用校验器时,您需要设置 sheet.setNeedVerify(true),以启用校验器功能。

另外,如果您需要自定义校验逻辑,可以实现 com.alibaba.excel.event.WriteHandler 接口,并在需要校验的列上调用 sheet.setWriteHandler(handler) 方法。

引用chatGPT作答,您可以使用EasyExcel提供的com.alibaba.excel.metadata.CellData和com.alibaba.excel.metadata.DataValidation类来实现这个功能。

下面是实现步骤:

1.创建一个类,实现com.alibaba.excel.write.handler.WriteHandler接口。

2.在实现的WriteHandler接口的beforeSheetCreate方法中,创建一个com.alibaba.excel.metadata.DataValidation对象,并设置校验规则。

3.在beforeSheetCreate方法中,通过com.alibaba.excel.write.metadata.holder.WriteSheetHolder对象获取到当前正在创建的com.alibaba.excel.write.metadata.holder.WriteTableHolder对象,然后通过com.alibaba.excel.write.metadata.holder.WriteTableHolder对象获取到要添加校验的列。

4.在获取到要添加校验的列之后,调用com.alibaba.excel.write.metadata.holder.WriteTableHolder对象的setNeedVerify(boolean)方法,将needVerify参数设置为true。

5.在获取到要添加校验的列之后,调用com.alibaba.excel.write.metadata.holder.WriteTableHolder对象的setDataValidation(DataValidation)方法,将DataValidation对象设置为该列的校验规则。

下面是示例代码:

public class DateValidationHandler implements WriteHandler {
    
    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        DataValidation dataValidation = new DataValidation(new CellRangeAddressList(1, Integer.MAX_VALUE, 1, 1), 
                                                           DataValidationConstraint.createDateConstraint(
                                                               OperatorType.BETWEEN, "1900/01/01", "9999/12/31", "yyyyMM"));
        dataValidation.setShowErrorBox(true);
        dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);
        dataValidation.createErrorBox("日期格式错误", "请输入正确的yyyyMM日期格式!");
        dataValidation.setSuppressDropDownArrow(true);
        
        WriteTableHolder writeTableHolder = writeSheetHolder.getOrCreateTableHolder();
        writeTableHolder.setNeedVerify(true);
        writeTableHolder.setDataValidation(dataValidation);
    }
    
    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // do nothing
    }
}

在导出Excel时,将实现了WriteHandler接口的类作为参数传递给com.alibaba.excel.EasyExcel.write(...)方法即可。

示例代码:

String fileName = "test.xlsx";
EasyExcel.write(fileName)
         .head(head)
         .registerWriteHandler(new DateValidationHandler()) // 注册校验处理器
         .sheet("Sheet1")
         .doWrite(data);

这样就完成了在数据导出时,给某一列添加校验的功能。

该回答引用ChatGPT
EasyExcel 是一个简单的、基于 Java 的读/写 Excel 操作工具,使用方便快捷,支持多种模板导出方式。如果您要在某一列添加校验,需要使用 @ExcelProperty 注解的 verfiyHandler 属性来声明自定义校验器。下面是相关代码示例:

java
public class DemoData {
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
@ExcelProperty(value = "日期", index = 0, verifyHandler = DateVerifyHandler.class)
private Date date;

// getter/setter 略
}

public class DateVerifyHandler implements VerifyHandler {
@Override
public String handler(Object o, ExcelVerifyParam excelVerifyParam) {
if (o == null || !(o instanceof Date)) {
return "日期格式不正确";
}

Date date = (Date) o;
Calendar calendar = Calendar.getInstance();
calendar.set(2021, 0, 1); // 限定日期格式从 2021 年 1 月 1 日开始
if (date.before(calendar.getTime())) {
return "日期格式不正确,不允许输入早于 2021 年 1 月 1 日的日期";
}

return null;
}
}


在具体的实现代码中,我们使用了 @DateTimeFormat 注解来指定日期格式,默认情况下 EasyExcel 能够自动识别 date 类型,但是日期格式不定的情况下,还需要使用该注解来进行指定,其中 verifyHandler 属性指定了自定义的校验器。DateVerifyHandler 类中的 handler 方法接收 Excel 属性注解值和单元格值,即 o 和 excelVerifyParam,根据实际要求来编写日期格式的判断逻辑,并返回错误信息。需要注意的是,自定义校验器需要实现 VerifyHandler 接口,同时返回的校验信息将会显示在 Excel 单元格的提示信息中。

然后在编写测试用例时,需要使用 WritingBuilder 的 addVerifyHandler 来激活校验器,代码如下:

java
@Test
public void writeExcelWithValidator() {
File file = new File("demo.xlsx");
try (OutputStream outputStream = new FileOutputStream(file)) {
List data = new ArrayList<>();
DemoData demoData = new DemoData();
demoData.setDate(new Date());
data.add(demoData);

EasyExcel.write(outputStream, DemoData.class)
.sheet("sheet1")
.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
.addVerifyHandler(new DateVerifyHandler())
.doWrite(data);
} catch (IOException e) {
e.printStackTrace();
}
}


通过调用 WritingBuilder 的 addVerifyHandler 方法来激活校验器。最后,将数据写入 Excel 文件中。

需要注意的是,使用校验器功能时,需要至少使用 EasyExcel 3.1.2 版本。该回答引用ChatGPT
Easyexcel可以使用Validation来给某一列添加校验,可以指定校验的类型和错误提示信息。对于日期格式的数据,可以使用DataValidation.ValidationType.DATE类型来进行校验。下面是具体的代码实现:

java
// 在第一列(A列)添加日期校验
DataValidation dateValidation = new DataValidationBuilder()
.type(DataValidation.ValidationType.DATE)
.error("请输入日期")
.createErrorBoxTitle("日期格式不正确")
.createErrorBoxText("请输入正确的日期格式,如:2022/01/01")
.allowBlank(false)
.build();

Sheet sheet = new Sheet(1, 0);
// 第一列设置校验
sheet.addValidationData(new CellRangeAddressList(1, Integer.MAX_VALUE, 0, 0), dateValidation);

// 往excel文件中写入数据
List> data = new ArrayList<>();
data.add(Arrays.asList("日期", "姓名", "成绩"));
data.add(Arrays.asList("2022/01/01", "张三", "80"));
data.add(Arrays.asList("2022/02/01", "李四", "90"));
data.add(Arrays.asList("2022/03/01", "王五", "85"));

ExcelWriter writer = EasyExcel.write("校验数据.xlsx").build();
writer.write(data, sheet);
writer.finish();


以上代码中,我们创建了一个DataValidation,使用DataValidationBuilder来构建。具体说明如下:

- type方法:指定校验类型为DATE;
- error方法:指定校验错误提示信息;
- createErrorBoxTitle方法:设置错误提示框的标题;
- createErrorBoxText方法:设置错误提示框的内容;
- allowBlank方法:允许输入空值,设置为false。

然后我们将DataValidation应用到sheet中指定的列,这里我们将其应用到第一列,即A列。

最后,我们将数据写入到excel文件中,生成的excel文件中的第一列会带有日期格式的校验。

以下内容部分参考ChatGPT模型:
首先需要使用EasyExcel的注解来标识出需要校验的列,例如:

@Data
public class DemoData {

    @DateTimeFormat("yyyy年MM月dd日")
    @ExcelProperty(value = "日期", index = 0)
    @NotNull(message = "日期不能为空")
    private Date date;

    @ExcelProperty(value = "姓名", index = 1)
    private String name;

    @ExcelProperty(value = "年龄", index = 2)
    private Integer age;

}

在上述代码中,我们使用了@NotNull注解来标识出日期列不能为空,同时使用了@DateTimeFormat注解来指定日期格式。

接下来,我们需要在写入Excel时添加校验规则。具体操作如下:

public void writeExcelWithConstraint() {
    String fileName = "demo-with-constraint.xlsx";

    // 设置校验规则
    List<ConstraintViolationSheet> violationList = new ArrayList<>();
    ConstraintViolationSheet violationSheet = new ConstraintViolationSheet();
    violationSheet.setSheetName("Sheet1");
    List<ConstraintViolation> constraintViolationList = new ArrayList<>();
    ConstraintViolation constraintViolation = new ConstraintViolation();
    constraintViolation.setIndex(0);
    constraintViolation.setFormula("NOT(ISERROR(DATEVALUE(A1))))");
    constraintViolation.setValidationType(ValidationType.DROP_DOWN_LIST);
    constraintViolation.setExplicitListValues(Arrays.asList("2022年01月01日", "2022年01月02日", "2022年01月03日"));
    constraintViolationList.add(constraintViolation);
    violationSheet.setConstraintViolationList(constraintViolationList);
    violationList.add(violationSheet);

    // 写入Excel
    EasyExcel.write(fileName, DemoData.class)
            .sheet()
            .registerWriteHandler(new ConstraintViolationSheetWriteHandler(violationList))
            .doWrite(getData());
}

在上述代码中,我们首先设置了校验规则。具体来说,我们创建了一个ConstraintViolation对象,并指定了校验的列索引、校验公式、校验类型以及下拉列表的值。然后,我们将这个ConstraintViolation对象添加到ConstraintViolationSheet对象中,并将这个ConstraintViolationSheet对象添加到校验规则列表中。

接着,我们在写入Excel时注册了一个ConstraintViolationSheetWriteHandler处理器,并将校验规则列表传入该处理器。这样,在写入Excel时,EasyExcel会自动根据校验规则来添加校验。

最后,我们需要编写ConstraintViolationSheetWriteHandler处理器。该处理器的代码如下:

public class ConstraintViolationSheetWriteHandler implements WriteHandler {

    private List<ConstraintViolationSheet> violationList;

    public ConstraintViolationSheetWriteHandler(List<ConstraintViolationSheet> violationList) {
        this.violationList = violationList;
    }

    @Override
    public void sheet(int sheetNo, Sheet sheet) {

        for (ConstraintViolationSheet violationSheet : violationList) {
            if (sheet.getSheetName().equals(violationSheet.getSheetName())) {
                for (ConstraintViolation violation : violationSheet.getConstraintViolationList()) {
                    DataValidation dataValidation = null;
                    if (violation.getValidationType() == ValidationType.DROP_DOWN_LIST) {
                        // 下拉列表校验
                        DataValidationHelper validationHelper = sheet.getDataValidationHelper();
                        DataValidationConstraint validationConstraint = validationHelper.createExplicitListConstraint(
                                violation.getExplicitListValues().toArray(new String[0]));
                        CellRangeAddressList rangeList = new CellRangeAddressList(1, sheet.getLastRowNum(), violation.getIndex(), violation.getIndex());
                        dataValidation = validationHelper.createValidation(validationConstraint, rangeList);
                    } else if (violation.getValidationType() == ValidationType.DATE) {
                        // 日期格式校验
                        DataValidationHelper validationHelper = sheet.getDataValidationHelper();
                        DataValidationConstraint validationConstraint = validationHelper.createFormulaListConstraint(violation.getFormula());
                        CellRangeAddressList rangeList = new CellRangeAddressList(1, sheet.getLastRowNum(), violation.getIndex(), violation.getIndex());
                        dataValidation = validationHelper.createValidation(validationConstraint, rangeList);
                    }

                    if (dataValidation != null) {
                        sheet.addValidationData(dataValidation);
                    }
                }
            }
        }
    }

    @Override
    public void row(int rowNum, Row row) {
    }

    @Override
    public void cell(int cellNum, Cell cell) {
    }

    @Override
    public void endSheet() {
    }
}

在上述代码中,我们首先遍历校验规则列表,找到当前需要校验的Sheet,并遍历该Sheet上需要校验的列。然后,我们根据校验类型来创建不同类型的校验,例如下拉列表校验、日期格式校验等。最后,我们将创建的校验添加到当前Sheet中。

完整代码示例可以参考下面的链接:

https://github.com/alibaba/easyexcel/blob/master/src/test/java/com/alibaba/easyexcel/test/demo/WriteTest.java
如果我的建议对您有帮助、请点击采纳、祝您生活愉快

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/715949
  • 这篇博客你也可以参考下:使用EasyExcel导入表格来进行批量插入数据----后端实现
  • 除此之外, 这篇博客: EasyExcel的基本使用及在项目中的应用中的 一、Excel导入导出 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    Excel导入导出的重要性

    在针对运营商(移动、联通、电信、铁塔)的信息类的系统中,由于相关的从业人员习惯于Excel的办公思维。导致在做该类系统中时,Excel的导入导出功能,几乎成了每个有列表展示的页面上必备功能。因此,有必要对Excel导入导出功能进行了解。

    Excel导入导出的应用场景

    1、数据导入:减轻录入工作量

    2、数据导出:统计信息归档

    3、数据传输:异构系统之间数据传输


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^