一、什么是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
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 数据导入校验的过程中,我们需要注意一下几点:
- Excel 中的数据校验与 Java 实体类的数据校验并不冲突。因此,不要求两者保持一致,Excel中的校验规则在导入时会与 Java 实体类的注解共同起作用,多重保障,防止错误数据的进入。
- ImportParams 类中的校验规则并非所有的规则都需要设置,可以根据需要选择合适的规则项设置。
- 对于校验失败的数据,如果不进行处理,会导致程序内存泄漏问题,可以通过将错误信息保存在一个 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技术站