Java中easypoi的使用之导入校验

一、什么是easypoi

EasyPoi是一套基于apache poi封装的Java Excel工具,目的是为了简化Excel操作,特别是复杂的不规则的报表格式的导出,同时实现Excel中一些特殊类型的导入导出,如图片、公式等。可以用于做POI导出和POI导入,功能非常强大。

二、导入校验的步骤

2.1 准备工作

首先,我们需要准备一个带有数据的Excel模板,并定义好各个数据列的校验规则。然后,将该模板放在项目中的resource目录下,方便程序读取。

2.2 使用easypoi实现导入验证

使用easypoi的导入校验需要用到以下两个类:

  • ImportParams:导入参数类,用于设置导入参数。
  • ExcelImportUtil:用于解析Excel的工具类。

首先,我们定义一个实体类,用于存储Excel表格中的数据。

public class User {
    @NotBlank(message = "用户名不能为空")
    private String name;
    @NotNull(message = "年龄不能为空")
    @Max(value = 200, message = "年龄不能超过200岁")
    private Integer age;
    @NotBlank(message = "性别不能为空")
    @Pattern(regexp = "男|女", message = "性别只能是“男”或“女”")
    private String sex;
    // 省略 getter 和 setter 方法
}

其中,@NotBlank、@NotNull、@Max、@Pattern 等注解是用于校验数据的规则注解,可以利用这些注解实现对Excel表格数据的校验。

接下来,我们使用 ImportParams 类来设置导入参数,例如:设置开始行号、校验失败是否停止等。

ImportParams params = new ImportParams();
params.setHeadRows(1); //设置有标题行
params.setStartSheetIndex(0); // 设置开始行号:第1行(标题为第0行)
params.setReadSingleCell(true); // 设置是否只读第一个单元格
params.setTitleRows(1); //设置有标题行
params.setNeedVerfiy(true); // 设置是否校验

然后,我们使用 ExcelImportUtil 工具来读取 Excel 文件,同时对文件进行数据校验。具体实现如下:

File file = new File("classpath:template.xlsx");
List<User> list = ExcelImportUtil.importExcel(file, User.class, params);
for (User user : list) {
    System.out.println(user);
}

以上代码中,classpath:template.xlsx 是要导入的 Excel 文件,在导入数据完成后,会将数据解析成 User 类型的 List 集合,并且对每个用户的数据进行了校验。

2.3 校验失败的处理

以上代码中,校验失败的信息会存储在 List failedList 参数中。我们可以通过遍历 failList 集合,获取每条失败的数据并返回结果给前台,让前台了解到哪些数据导入失败,具体实现如下:

File file = new File("classpath:template.xlsx");
ImportParams params = new ImportParams();
List<User> list = ExcelImportUtil.importExcel(file, User.class, params);
if (CollectionUtils.isNotEmpty(list)) {
    // 表示导入成功
    return ResponseData.ok(list);
} else if (CollectionUtils.isNotEmpty(params.getFailList())) {
    // 表示导入失败
    StringBuilder builder = new StringBuilder();
    builder.append("Excel表格中的数据存在错误,请检查。\n");
    List<FailRow> failList = params.getFailList();
    for (FailRow failRow : failList) {
        builder.append("第 " + (failRow.getRowNum() + 1) + " 行第 " + (failRow.getColumnNum() + 1) + " 列的错误信息为:" + failRow.getMsg() + "\n");
    }
    return ResponseData.error(builder.toString());
}

在 Excel 数据导入校验的过程中,我们需要注意一下几点:

  1. Excel 中的数据校验与 Java 实体类的数据校验并不冲突。因此,不要求两者保持一致,Excel中的校验规则在导入时会与 Java 实体类的注解共同起作用,多重保障,防止错误数据的进入。
  2. ImportParams 类中的校验规则并非所有的规则都需要设置,可以根据需要选择合适的规则项设置。
  3. 对于校验失败的数据,如果不进行处理,会导致程序内存泄漏问题,可以通过将错误信息保存在一个 List 对象中,最终返回给用户。同时需要注意,返回的错误信息应尽可能友好和详细,帮助用户尽快定位错误问题和解决方案。
2.4 示例

接下来,我们通过两个示例来演示 easypoi 的导入校验过程。

示例一

在这个案例中,我们通过导入 Excel 表格中的用户信息,检查用户的姓名、年龄、性别等信息是否符合校验规范。

Excel表格数据参考如下:

姓名 年龄 性别
Rose 21
Jack 18
Tom 22
Lily
  • User 实体类
public class User {
    @NotBlank(message = "用户名不能为空")
    private String name;
    @NotNull(message = "年龄不能为空")
    @Max(value = 200, message = "年龄不能超过200岁")
    private Integer age;
    @NotBlank(message = "性别不能为空")
    @Pattern(regexp = "男|女", message = "性别只能是“男”或“女”")
    private String sex;
    // 省略 getter 和 setter 方法
}
  • 导入代码
@Test
public void importUserTest() {
    ImportParams params = new ImportParams();
    params.setHeadRows(1);
    params.setStartSheetIndex(0);
    params.setReadSingleCell(true);
    params.setTitleRows(1);
    params.setNeedVerfiy(true);
    File file = new File("classpath:user_template.xlsx");
    List<User> list = ExcelImportUtil.importExcel(file, User.class, params);
    if (CollectionUtils.isNotEmpty(list)) {
        System.out.println("导入成功的数据为:" + JSON.toJSONString(list));
    } else if (CollectionUtils.isNotEmpty(params.getFailList())) {
        System.out.println("Excel表格中的数据存在错误,请检查。");
        List<FailRow> failList = params.getFailList();
        for (FailRow failRow : failList) {
            System.out.println("第 " + (failRow.getRowNum() + 1) + " 行第 " + (failRow.getColumnNum() + 1) + " 列的错误信息为:" + failRow.getMsg());
        }
    }
}
  • 控制台输出
Excel表格中的数据存在错误,请检查。
第 4 行第 2 列的错误信息为:年龄不能为空

由于表格第 4 行的年龄数据为空,导致校验失败。

示例二

在这个案例中,我们通过导入 Excel 表格中的订单信息,检查订单的编码、数量、金额等信息是否符合校验规范。

  • Excel表格数据参考如下:
订单编码 商品名称 数量 金额
A001 商品A 100 100000.00
A002 商品B 200 200000.00
A003 商品C 300 300000.00
A004 商品D 400 400000.00
A005 商品E 500
A006 商品F 600 120000.00
  • Order 实体类
public class Order {
    @NotBlank(message = "订单编码不能为空")
    private String code;
    @NotBlank(message = "商品名称不能为空")
    private String name;
    @NotNull(message = "数量不能为空")
    @Min(value = 1, message = "数量必须大于等于1")
    @Max(value = 1000000, message = "数量不能超过1000000个")
    private Integer amount;
    @NotNull(message = "金额不能为空")
    @Min(value = 0, message = "金额必须大于等于0")
    @Max(value = 1000000, message = "金额不能超过1000000元")
    private BigDecimal price;
    // 省略 getter 和 setter 方法
}
  • 导入代码
@Test
public void importOrderTest() {
    ImportParams params = new ImportParams();
    params.setHeadRows(1);
    params.setStartSheetIndex(0);
    params.setReadSingleCell(true);
    params.setTitleRows(1);
    params.setNeedVerfiy(true);
    File file = new File("classpath:order_template.xlsx");
    List<Order> list = ExcelImportUtil.importExcel(file, Order.class, params);
    if (CollectionUtils.isNotEmpty(list)) {
        System.out.println("导入成功的数据为:" + JSON.toJSONString(list));
    } else if (CollectionUtils.isNotEmpty(params.getFailList())) {
        System.out.println("Excel表格中的数据存在错误,请检查。");
        List<FailRow> failList = params.getFailList();
        for (FailRow failRow : failList) {
            System.out.println("第 " + (failRow.getRowNum() + 1) + " 行第 " + (failRow.getColumnNum() + 1) + " 列的错误信息为:" + failRow.getMsg());
        }
    }
}
  • 控制台输出
Excel表格中的数据存在错误,请检查。
第 5 行第 4 列的错误信息为:金额不能为空

由于表格第 6 行的金额数据为空,导致校验失败。

三、总结

easypoi 是一个非常强大的 Java Excel 工具库,可以方便地实现 Excel 导入导出的功能。使用 easypoi 实现 Excel 数据导入校验需要按照特定的步骤来进行,特别是校验失败的处理,需要精心准备,以便使用户能够清楚地了解到错误信息,并能够快速地定位问题和解决问题。最后我们还通过两个实例来演示了 easypoi 的 Excel 数据导入校验过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中easypoi的使用之导入校验 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Sprint Boot @DeleteMapping使用方法详解

    @DeleteMapping是Spring Boot中的一个注解,它用于将HTTP DELETE请求映射到控制器方法上。在使用Spring Boot开发Web应用程序时,@DeleteMapping是非常重要的。本文将详细介绍@DeleteMapping的作用和使用方法,并提供两个示例说明。 @DeleteMapping的作用 @DeleteMapping的…

    Java 2023年5月5日
    00
  • java8使用filter()取出自己所需数据

    下面我会详细讲解“Java8使用filter()取出自己所需数据”的完整攻略,包括使用filter()的语法和实际运用中的两条示例说明。 filter()的语法 在Java8中,Stream接口提供了filter()方法,用于对流中的元素进行过滤操作,返回一个新的流对象。filter()方法的语法如下: Stream<T> filter(Pred…

    Java 2023年5月26日
    00
  • 如何进行Java代码优化?

    如何进行Java代码优化? Java代码的优化可以优化程序的性能,减少资源的占用,提高性能的稳定性,以下是一些进行Java代码优化的技巧。 1. 变量的作用域 变量的作用域是指,变量在程序中可以被访问的范围,尽可能缩小变量的作用域可以提高代码性能。 示例: public class Demo { public void method() { //不需要在fo…

    Java 2023年5月11日
    00
  • SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解

    SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解 在 Spring Boot 应用程序中,我们可以使用 @ConditionalOnXXX 注解来控制自动配置是否生效。例如,@ConditionalOnClass 注解可以在 classpath 中存在指定的类时生效,@ConditionalOnMissingBean 注解…

    Java 2023年5月15日
    00
  • 常见的Java调试器有哪些?

    Java调试器是一种用于调试Java应用程序和Java虚拟机(JVM)的工具,它可以帮助开发人员在开发Java应用程序时快速定位和解决程序中的错误。常见的Java调试器有以下几种: Eclipse调试器 IntelliJ IDEA调试器 NetBeans调试器 JDB调试器 以下是常见的Java调试器的详细使用攻略: 1. Eclipse调试器使用攻略 Ec…

    Java 2023年5月11日
    00
  • Java的Struts框架报错“ControllerException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ControllerException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置Action,则可能会出现此。在这种情况下,需要检查配置文件以解决此问题。 类加载问题:如果类加载器无法加载所需的类,则可能会出现此。在这种情况下,需要检查类路径以解决此问题。 以下是两个实例: 例…

    Java 2023年5月5日
    00
  • java 日期各种格式之间的相互转换实例代码

    下面是 “Java 日期各种格式之间的相互转换实例代码” 的完整攻略: 基本介绍 在Java中,可以使用java.text.SimpleDateFormat类来格式化日期,具体的格式定义可以参考Java官方文档中的SimpleDateFormat类说明(notes)。在这个过程中,需要注意日期格式的大小写,具体规则请参考文档说明。 日期转换 以下是实现日期转…

    Java 2023年5月20日
    00
  • Java解析json报文实例解析

    下面我来详细讲解“Java解析json报文实例解析”的完整攻略,包含以下几个步骤: 1. 基础知识 在进行 Java 解析 JSON 报文之前,需要先掌握一些基础知识,包括: 什么是 JSON?JSON 是一种轻量级的数据交换格式,可以被多种编程语言解析。 JSON 数据结构:JSON 由键值对或数组组成。 Java 解析 JSON 的库:常用的有 Jack…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部